Thread_list是struct thread_info类型的一个链表,记录的是被调试进程的所有线程的信息,里面包含线程用户态和内核态的一些信息。线程用户态信息的捕获基于libthread_db库,该库提供了一组调试接口。这么一组libpthread_db调试接口在gdb中使用struct thread_db_info进行管理,该数据主要结构的具体信息如下表: 在被调试进程...
多线程调试的主要任务是准确及时地捕捉被调试程序线程状态的变化的事件,并且GDB针对根据捕捉到的事件做出相应的操作,其实最终的结果就是维护一根叫thread list的链表。上面的调试命令都是基于thread list链表来实现的,后面会有讲到。 0x01:Gdb在linux平台多线程调试实现主要依赖下面三个文件 thread.c:文件它的任务非常简...
1.gcc -g gbd.c -o my_debug -lpthread 2.list [行号] b 4.r 5.delete [断点号] 6.n 7.p [变量名] 9.thread apply all bt,thread apply [编号…] [命令] threads,thread+线程编号 11.set scheduler-locking on 11. c 12.finish 13.q 二、GDB调试多进程 1.show follow-fork-mode,set foll...
函数info_threads_command是被命令info threads调用的,就是显示thread_list列表的信息。 函数thread_command是被命令thread调用,切换当前线程最终调用的函数是switch_to_thread,这个函数会先将当前调试线程变量inferior_ptid,然后对寄存器和frame缓冲进行刷新。 函数thread_apply_command被命令thread apply调用,这个函数的实际...
thread n:切换线程,参数为线程号,可以通过threads查看,一般常用的是通过threads查看线程序号,通过thread n切换过去,再用bt查看线程栈的信息; condition:给断点设置触发条件,比如b 10 if a > b与b 10然后condition 1 if a> b等价(假设b 10的断点号为1),取消断点条件用condition 断点号; ...
thread 线程ID # 切换到某个线程 要为2号线程在第155行代码处设置断点 b 155 thread 2 为3号线程执行print命令,查看线程对应的变量local_data的值 thread apply 2 3 i locals 在查看所有线程栈回溯信息时,thread apply all bt命令非常有用,尤其是在大型程序的调试过程中,比如死锁的调试。发布...
std::this_thread::sleep_for(std::chrono::seconds(10)); std::cout << "in fun_int n = " << n << std::endl; return 0; } int fun_string(const std::string &s) { std::this_thread::sleep_for(std::chrono::seconds(10)); ...
p [变量名]#print [变量名] 输出该变量的值display [变量名]#调试运行的每一步自动输出该变量的值bt#显示当前的函数调用堆栈情况list[行数]#显示当前执行的代码,默认10行watch [变量名]#设置变量监视点,在变量值改变时暂停程序。 info breakpoints#显示当前已...
thread ID 切换当前调试的线程为指定ID的线程 attach process-id 在gdb状态下,开始调试一个正在运行的进程 thread apply all command 所有线程执行command 下面给大家一个好玩的多线程程序,答案就在某个线程的堆栈中,先不要看下面的答案,自己试着用gdb玩一下哈(Linux 64bit)。
对于gdb的命令很多人可能都已经很熟悉了,本文介绍的mi层命令可能很少有人用到,它也是gdb的一部分,主要目的是为一些目标系统如IDE等提供调试功能,如eclipse下c/c++的cdt插件的底层就是调用的mi层命令,cdt的包里面有两个类RxThread,TxThread就是一个发送mi命令,一个接收返回数据的,大家有兴趣可以研究下。