【问题标题】:Have breakpoint print the name of the calling function让断点打印调用函数的名称
【发布时间】:2019-01-29 04:36:52
【问题描述】:

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

与此相关,我是否可以让断点条件取决于哪个函数让我们到达断点?

【问题讨论】:

  • print(#function)
  • 打印我们当前所在的函数,而不是调用它的函数(调用堆栈中的前一个函数)。此外,它似乎不能用作调试器消息。 @#function@ 打印 "$__lldb_wrapped_expr_39"
  • 把它也加到其他方法中就可以看到是哪一个调用了

标签: swift xcode debugging


【解决方案1】:

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

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

当断点被命中时,您将在 Xcode 窗口底部“调试区域”的“调试器输出”窗格中看到与此类似的输出。

* 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

【讨论】:

  • 谢谢@Craig,这看起来很棒。实际上也回答了我从断点而不是从代码中获取我想要的结果的问题。
【解决方案2】:

如果你添加一个默认值为#function的字符串参数,它会被调用函数名填充:

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

func foo() {
    bar()
}

foo()

打印“从函数 foo() 调用”

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

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

打印“从函数 snort 调用”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2011-10-19
    • 2018-09-28
    相关资源
    最近更新 更多