例如:线程 A 创建线程 B。我希望在线程 A 开始创建线程 B 时阻止它。但我不知道如何使用 GDB 来做到这一点。任何帮助将不胜感激!谢谢
问问题
402 次
1 回答
1
使用GDB 不间断模式并在程序调用 pthread_create() 后的行处放置断点。
从 bad_thread 读取符号...完成。 (gdb) 设置目标异步 1 (gdb) 关闭分页 (gdb) 设置不间断 (gdb) b pthread_create 0x400570 处的断点 1 (gdb) r 启动程序:bad_thread [启用使用 libthread_db 进行线程调试] pthread_create@plt () 中的断点 1, 0x0000000000400570 (gdb) BT #0 0x0000000000400570 在 pthread_create@plt () #1 0x00000000004006d8 in main () at bad_thread.c:21 (gdb) 列表 12 pthread_mutex_unlock(&x_mutex); 13 14 pthread_exit(NULL); 15 } 16 17 整数 18 主要(){ 19 pthread_t tid1,tid2; 20 21 pthread_create(&tid1, NULL, add_thread, NULL); (gdb) b bad_thread.c:22 0x4006d8 处的断点 2:文件 bad_thread.c,第 22 行。 (gdb) b add_thread 0x400694 处的断点 3:文件 bad_thread.c,第 10 行。 (gdb) c 继续。 [新线程 0x40a00960 (LWP 26829)] bad_thread.c:22 处的断点 2,main () 22 pthread_create(&tid2, NULL, add_thread, NULL); (gdb) 断点 3,add_thread (arg=0x0) at bad_thread.c:10 10 pthread_mutex_lock(&x_mutex); BT #0 main () at bad_thread.c:22 (gdb)
解释以上内容:
- 根据 GDB 文档打开不间断模式
- 在 pthread_create() 处设置断点以确定程序在哪里调用它
- 运行并命中断点
- backtrace 和 list 查找下一行代码
- 在下一行代码和线程启动函数(在本例中为 add_thread)放置一个断点
- 跑
- 请注意,我们在原始线程的下一行代码处命中了断点。新线程在后台继续运行,然后在线程启动函数处命中断点。
于 2013-11-14T16:52:04.177 回答