【问题标题】:Is there a way to set a breakpoint at the start of any NSLog statement?有没有办法在任何 NSLog 语句的开头设置断点?
【发布时间】:2013-06-18 21:46:08
【问题描述】:

大型代码库的某些部分正在打印出奇怪的NSLog 语句,我正在尝试检测它的来源。有没有办法在每个NSLog 调用的开头放置一个断点,这样我就可以看到它是从哪里调用的,而不是手动在所有调用NSLog 的地方放置断点?

【问题讨论】:

  • 去获取DLog,全局查找替换所有NSLog。
  • @Wain 如果某些仅二进制库(例如 UIKit)正在调用 NSLog,这将不起作用。
  • 我可能会用自己的宏覆盖 NSLog 宏——一个调用断点挂钩的宏。

标签: objective-c xcode debugging logging breakpoints


【解决方案1】:

Xcode 6 中:

第 1 步
在左侧的 Navigator 上,转到 Breakpoint Navigatorcommand ⌘ + 7):

第 2 步
点击左下角的+按钮(添加新断点),
然后选择添加符号断点...

第 3 步
符号中,输入NSLog

或者,您可以在 DebugBreakpointsCreate Symbolic Breakpoint 中执行相同的操作。

对于 Xcode 5,请参阅 this

【讨论】:

    【解决方案2】:

    如果您想中断某个日志消息,您可以使用:

    此示例将在每个包含“警告”一词的日志上中断。

    更新: 在较新的设备上使用 $x0。 模拟器和老版本使用 $r0。 $arg0 应该适用于所有情况。

    【讨论】:

    • 非常感谢。这帮助我解决了我在问题stackoverflow.com/questions/41281627/… 中遇到的问题
    • 保存重新输入,这里是字符串:[(NSString*)$r0 containsString: @"Warning"]
    • 感谢您的回答,我在 xCode 9.3 中尝试过,但出现错误:use of undeclared identifier '$r0。尝试了这个,效果很好:[(NSString*)$arg1 containsString: @"Warning"]
    • 嗨穆斯塔法。在较新的设备上,寄存器标记为 x。所以 $x0 应该适用于你的情况。
    【解决方案3】:

    在断点导航器中(command+6)添加(在底部,有一个加号)一个符号断点并使用NSLog作为符号。

    【讨论】:

      【解决方案4】:

      根据this,您可以在 lldb 控制台中设置这种断点:

      breakpoint set --name NSLog
      

      使用 Xcode 执行此操作的一种方法是在 main 函数或 AppDelegate applicationDidFinishLaunchin 上放置一个断点(阅读:尽快)。 然后,您运行您的应用程序,当它在所述断点处暂停时,您可以访问 lldb 控制台:您输入上述行并按回车键,lldb 会打印如下内容:

      Breakpoint 3: where = Foundation`NSLog, address = 0x32a3da08
      

      此时,您恢复您的应用,并在调用NSLog 时再次暂停(注意使用调试导航器的调用堆栈)。

      【讨论】:

        猜你喜欢
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 2020-08-20
        • 2016-09-24
        • 2011-05-16
        • 2014-10-02
        相关资源
        最近更新 更多