【问题标题】:lldb command jump: resume outside the current function?lldb 命令跳转:在当前函数之外恢复?
【发布时间】:2018-05-17 11:58:57
【问题描述】:

LLDB 命令jump 让我可以在与它停止的位置不同的位置恢复程序执行,但它似乎仅限于当前函数内的地址:

(lldb) jump CLI.cpp:15
error: CLI.cpp:15 is outside the current function.

我对此很好奇,因为lldb 的帮助中没有记录此限制,而jump <file>:<line> 的语法不知何故表明可以使用任意入口点:

(lldb) help jump
     ('_regexp-jump')  Set the program counter to a new address.  Expects 'raw'
     input (see 'help raw-input'.)

Syntax: 
_regexp-jump <line>
_regexp-jump +<line-offset> | -<line-offset>
_regexp-jump <file>:<line>
_regexp-jump *<addr>

'jump' is an abbreviation for '_regexp-jump'

我知道在不同的帧/堆栈中恢复可能会使程序进入不一致的状态,并产生“奇妙”的副作用。

如何跳转到lldb 中当前函数之外的行(忽略可能的副作用)?

【问题讨论】:

    标签: xcode lldb


    【解决方案1】:

    jump 是一个包装命令,它将底层thread jump 的一些常见用途打包成一个紧凑的形式。这就是所有_regex- 命令在lldb 中的内容。做:

    (lldb) help command regex
    

    如果您想了解更多有关此正则表达式命令的详细信息,当然还有

    (lldb) help thread jump
    

    对于您可以使用该命令执行的所有操作。

    包装器没有允许跳出当前函数的功能,因为这绝对不是一个安全的操作,所以默认情况下假设您在输入行或文件名时犯了错误...

    底层命令确实有一个--force 选项,允许您将电脑移出当前功能。

    【讨论】:

    • 非常感谢! thread jump -r -l 15 -f CLI.cpp 然后按继续完成这项工作。这样,我可以重新输入要分析的代码,再次触发断点,而无需单击应用程序或启动整个程序以再次到达感兴趣的点。当然,正如预期的那样,应用程序在之后无法正常运行,但它只是为了调试......
    • 请注意,在 lldb 中调试随机函数的另一种方法是在函数上设置断点,然后在 lldb 中使用 expr -i 0 -- myfunc() 手动调用它,然后您可以在函数中四​​处走动,查看任何内容, 完成后,输入continue 来完成函数调用并查看返回结果,或者运行thread return -x 来终止表达式求值并返回到之前的程序状态。唯一的危害是你调用的函数有什么副作用。
    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 2018-09-23
    • 2022-01-11
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多