【问题标题】:lldb objc_msgSend tracing on OS Xlldb objc_msg 在 OS X 上发送跟踪
【发布时间】:2013-04-26 09:29:02
【问题描述】:

我正在跟踪一个 OS X 应用程序,我希望能在 iOS 上找到这样的方式:

lldb Xcode: error: 'printf' is not a valid command

有没有办法做到这一点?我试过了

expr -- (void)printf("[%s, %s]\n",(char *) object_getClassName(*(long*)($esp+4)), (char *) *(long *)($esp+8) )

我认为 OS X 使用的是 64 位寄存器。所以这个命令不起作用(确实,它不起作用)。我应该如何编写这个命令?或者有一种简单的方法可以做到这一点?只是跟踪调用的类和方法

【问题讨论】:

    标签: macos debugging lldb


    【解决方案1】:

    您上面引用的命令仅适用于在 Mac 上作为 i386 进程运行的 iOS 模拟器应用程序。 $esp+4 表示第一个参数,$esp+8 表示在 i386 ABI 中传递的第二个参数。在 x86_64 和 arm 上,前几个参数在具有 $arg1$arg2 方便名称的寄存器中传递。所以试试

    p (void)printf("[%s, %s]\n", (char*)object_getClassName($arg1), $arg2)
    

    用于 arm/x86_64 架构。 (当然,p 在这里是expr -- 的别名——同样的,只是少了打字。)

    【讨论】:

    • 看来 printf 没有在 lldb 中打印一些东西(比如 (char*)object_getClassName($arg1),它可以工作)。如何获得输出打印?
    • 你在调试什么?在设备上运行的 iOS 项目?一个 GUI Mac 应用程序(大概是 x86_64)?使用命令行lldb的命令行mac程序?附加到正在运行的进程?执行此操作时,您正在实际程序中运行printf,因此输出将转到stdout 打印的任何位置...
    • 顺便说一句,您不需要通过 printf 打印。您可以在 lldb 中只说 p (char*) object_getClassName($arg1)p $arg2 并避免程序输出去向的麻烦。
    • 谢谢,我正在调试一个带有 Xcode 附加的 GUI Mac 应用程序。现在我知道了如何打印。非常感谢。
    • @JasonMolenda 不确定这是否仍然有效。我得到:“错误:执行被中断,原因:EXC_BAD_ACCESS(代码=1,地址=0x10004005)。进程已返回到表达式评估之前的状态。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2011-06-07
    • 2014-03-17
    • 2023-02-20
    • 2015-07-06
    • 2011-07-05
    相关资源
    最近更新 更多