LLDB运行Python调试脚本触发invalid thread错误,寻求解决方案
LLDB Python脚本执行时出现"invalid thread"错误
问题详情
使用Python脚本自动化LLDB调试时,执行脚本多次抛出error: invalid thread错误,但在LLDB的Python交互解释器中逐行执行相同命令却一切正常。
相关代码
main.c
#include <stdio.h> #include <stdlib.h> int addNumbs(int a, int b) { return a+b; } int main() { int a =5; int b= 24; int total = addNumbs(a,b); printf("%d\n", total); return 0; }
debugsample.py
import lldb debugger = lldb.debugger debugger.HandleCommand("b main") debugger.HandleCommand("r") for i in range(0,3): #execute next 3 times debugger.HandleCommand("n") debugger.HandleCommand("bt")
执行步骤及输出
clang -g main -o main lldb ./main (lldb) command script import debugsample.py Breakpoint 1: where = main`main + 15 at main.c:11:9, address = 0x0000000100003f0f Process 5344 launched: '/Users/xxxx/CLionProjects/C_Practice/main' (x86_64) error: invalid thread error: invalid thread error: invalid thread error: invalid thread Process 5344 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x0000000100003f0f main`main at main.c:11:9 8 9 int main() 10 { -> 11 int a =5; 12 int b= 24; 13 14 int* ptr = (int*)malloc(sizeof(int)); Target 0: (main) stopped.
原因分析
问题核心是脚本执行的时序问题:
调用debugger.HandleCommand("r")时,LLDB默认异步启动进程,脚本不会等待进程停在断点处,就立刻执行后续的n命令。此时进程仍处于运行状态,没有可供操作的暂停线程,LLDB因此抛出invalid thread错误。
而在交互模式下,手动执行命令时会等待r执行完成(进程停在断点)再输入下一条命令,所以不会触发该错误。
解决方案
需要确保进程进入停止状态后,再执行next这类需要操作暂停线程的命令,以下是两种可行的修复方式:
方式一:同步启动进程
通过process.Launch()同步启动进程,直到进程因断点停止,脚本才会继续执行后续命令:
import lldb debugger = lldb.debugger target = debugger.GetSelectedTarget() process = target.GetProcess() # 设置断点 debugger.HandleCommand("b main") # 同步启动进程,阻塞到进程停止 error = lldb.SBError() process.Launch(debugger.GetListener(), None, None, None, None, None, None, 0, False, error) if not error.Success(): print(f"启动进程失败: {error.GetCString()}") else: # 进程已停止,执行next命令 for _ in range(3): debugger.HandleCommand("n") # 打印调用栈 debugger.HandleCommand("bt")
方式二:监听进程停止事件
通过LLDB的事件监听机制,等待进程进入停止状态后再执行后续命令:
import lldb debugger = lldb.debugger listener = debugger.GetListener() debugger.HandleCommand("b main") debugger.HandleCommand("r") # 等待进程停止事件,超时时间1秒 event = lldb.SBEvent() while listener.WaitForEvent(1, event): if lldb.SBProcess.EventIsProcessEvent(event): state = lldb.SBProcess.GetStateFromEvent(event) if state == lldb.eStateStopped: break # 进程停止后执行调试命令 for _ in range(3): debugger.HandleCommand("n") debugger.HandleCommand("bt")
两种方式都能保证后续命令在进程停止、存在有效线程的状态下执行,彻底解决invalid thread错误。
内容的提问来源于stack exchange,提问作者tadm123
相关产品推荐
相关产品推荐

