2

例如:线程 A 创建线程 B。我希望在线程 A 开始创建线程 B 时阻止它。但我不知道如何使用 GDB 来做到这一点。任何帮助将不胜感激!谢谢

4

1 回答 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 回答