Pharo:如何在调试器中查看 newProcess 的发送者?
Pharo: How to view the senders of newProcess in a Debugger?
我正面临这样的调试情况。我能看到的最古老的方法是 BlockClosure newProcess。
但我需要查看是谁发起了 newProcess 发送。当我单击调试器方法列表中的方法时,堆栈不会像通常显示调用者那样扩展。
这在 Pharo 中可行吗?
简答:没有。新进程在其概念形成之前没有任何历史记录。
稍微长一点的答案:如果您愿意做一些工作,您可以使用正常的闭包创建在新进程中嵌入对调用进程的引用。这是一个例子:
| currentStack forkedProcess |
currentStack := thisContext copyStack.
forkedProcess := [
| referenceToCaller |
referenceToCaller := currentStack.
self performOperations ] fork.
请注意,此 不会 增强您的调试体验,因为调试器不知道您有该引用。为此,您需要扩展当前进程的堆栈(上述的变体):
forkedProcess := [
thisContext bottomContext privSender: currentStack.
self performOperations ] fork.
像这样操作上下文链时要非常小心。您可能会遇到难以理解和调试的情况。我在这里展示的是为了说明,如果你不知道系统是如何工作的,就不应该使用。
我正面临这样的调试情况。我能看到的最古老的方法是 BlockClosure newProcess。
但我需要查看是谁发起了 newProcess 发送。当我单击调试器方法列表中的方法时,堆栈不会像通常显示调用者那样扩展。
这在 Pharo 中可行吗?
简答:没有。新进程在其概念形成之前没有任何历史记录。
稍微长一点的答案:如果您愿意做一些工作,您可以使用正常的闭包创建在新进程中嵌入对调用进程的引用。这是一个例子:
| currentStack forkedProcess |
currentStack := thisContext copyStack.
forkedProcess := [
| referenceToCaller |
referenceToCaller := currentStack.
self performOperations ] fork.
请注意,此 不会 增强您的调试体验,因为调试器不知道您有该引用。为此,您需要扩展当前进程的堆栈(上述的变体):
forkedProcess := [
thisContext bottomContext privSender: currentStack.
self performOperations ] fork.
像这样操作上下文链时要非常小心。您可能会遇到难以理解和调试的情况。我在这里展示的是为了说明,如果你不知道系统是如何工作的,就不应该使用。