LLDB:使用SBTarget.EvaluateExpression对断点进行Python回调

时间:2018-03-28 10:40:28

标签: python lldb

我正在尝试在调用某个函数时执行Python回调。如果通过运行进程调用该函数,它可以工作,但是当我使用<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> <activity android:name="com.facebook.FacebookActivity" android:configChanges= "keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="@string/app_name" />

调用该函数时,它会失败

这是我的C代码:

SBTarget.EvaluateExpression

这是我的Python脚本:

#include <stdio.h>

int foo(void) {
    printf("foo() called\n");
    return 42;
}

int main(int argc, char **argv) {
    foo();
    return 0;
}

我收到以下错误:

import lldb
import os

def breakpoint_cb(frame, bpno, err):
    print('breakpoint callback')
    return False

debugger = lldb.SBDebugger.Create()
debugger.SetAsync(False)

target = debugger.CreateTargetWithFileAndArch('foo', 'x86_64-pc-linux')
assert target

# Break at main and start the process.
main_bp = target.BreakpointCreateByName('main')
process = target.LaunchSimple(None, None, os.getcwd())
assert process.state == lldb.eStateStopped


foo_bp = target.BreakpointCreateByName('foo')
foo_bp.SetScriptCallbackFunction('breakpoint_cb')

# Callback is executed if foo() is called from the program
#process.Continue()

# This causes an error and the callback is never called.
opt = lldb.SBExpressionOptions()
opt.SetIgnoreBreakpoints(False)
v = target.EvaluateExpression('foo()', opt)
err = v.GetError()
if err.fail:
    print(err.GetCString())
else:
    print(v.value)

当断点没有回调时,我得到同样的错误,所以它确实是导致问题的断点,而不是回调。设置error: Execution was interrupted, reason: breakpoint 2.1. The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation 时会计算表达式,但这在我的情况下没有用。

这是可以解决的问题还是错误或遗漏功能?

操作系统是Arch Linux,LLDB版本是6.0.0来自存储库。

1 个答案:

答案 0 :(得分:0)

IgnoreBreakpoints设置并不意味着您在运行时不会遇到断点。例如,您会注意到断点命中计数将以任何方式更新。相反,它意味着:

是的:如果我们达到断点,我们将自动恢复

错误:如果我们遇到断点,无论

,我们都会停止

False功能用于调用函数,因为您希望在函数中停止它或为调试该函数而调用的函数。因此,覆盖断点条件和命令是正确的做法。

出于您的目的,我认为您希望IgnoreBreakpoints为True,因为您还希望表达式求值成功。

OTOH,如果我理解你的意图,导致你出问题的是,当IgnoreBreakpoints为false时,lldb不会调用断点的命令。当我们强行停止时,它应该只跳过那一点工作。