让断点打印调用函数的名称

时间:2018-08-22 20:51:59

标签: swift xcode debugging

我想让断点打印在控制台中被调用的测试的名称。这可能吗?

相关地,我能否确定断点条件取决于哪个函数使我们到达了断点?

2 个答案:

答案 0 :(得分:1)

虽然名称不完全是“函数”,但您可以使用lldb的命令将调用堆栈尽可能远地打印出来。

在Xcode中,使用bt 2的“调试器命令”操作创建一个断点(2限制了要打印的调用堆栈的深度)。 如果您不希望断点实际停止处理,请同时勾选底部的“自动继续...”复选框。

Setting an lldb command using a breakpoint action

点击断点后,您将在Xcode窗口底部的“调试区域”的“调试器输出”窗格中看到类似的输出。

lldb output from bt

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  * frame #0: 0x0000000104982fa8 SharingTest`DataManager.loadFromDisk(self=0x000060800005e3f0) at DataManager.swift:66
    frame #1: 0x0000000104998dbe SharingTest`AppDelegate.applicationDidBecomeActive(application=0x00007fe6b9600220, self=0x000060400005b2d0) at AppDelegate.swift:56

答案 1 :(得分:0)

如果添加默认值为#function的字符串参数,则会使用调用函数名称填充该参数:

func bar(_ funcName:String = #function) {
    print("called from function", funcName)
}

func foo() {
    bar()
}

foo()

显示“从函数foo()调用”

唯一的问题是,如果您传递一个实际的字符串值,它将覆盖默认值,因此:

func foo() {
    bar("snort")
}

打印“从函数snort调用”