Ann*_*nne 3 c++ multithreading gdb segmentation-fault
我正在尝试调试一个相当复杂的程序,即seg faulting.我刚刚了解了gdb,并试图用它来发现问题.目前,它显示
[New Thread 0x7fff4963700 (LWP 4768)]
[New Thread 0x7fff1faf700 (LWP 4769)]
[New Thread 0x7fff17ae700 (LWP 4768)]
Run Code Online (Sandbox Code Playgroud)
我的计划开始后不久.如果我编写了多线程代码,那将会很棒,但我没有.有没有办法确切地说明创建这些新线程的代码行是什么?
在Linux catch syscall clone上工作,应该打破所有线程(可能还有一些进程)的创建.请注意,它将在创建者线程中断开(=新线程尚未启动).
由于你获得了导致的完整回溯clone,如果你需要提取新的线程入口点,你应该这样做,up直到你到达pthread_create(或类似的库函数)堆栈帧并从它的参数中取出它(你也可以直接检查参数to clone,但我担心那里的地址会有一些pthread库存根).
线程有自己的调用堆栈。您唯一能看到的就是堆栈底部的值。将线程 ID指向t <thread id>or并使用orthread <thread id>获取调用堆栈。您可以在应用程序暂停执行和运行期间获取线程 ID 。btbacktracegdbinfo threads
例如,我的 gdb 会话如下(特别试图让您更清楚):
(gdb) t 23
[Switching to thread 23 (Thread 0x7fff8ffff700 (LWP 32334))]
#0 0x00007fffc0cb829e in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
(gdb) bt
#0 0x00007fffc0cb829e in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
#1 0x00007fffc0cb5bb0 in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
#2 0x00007ffff52b10a5 in start_thread (arg=0x7fff8ffff700) at pthread_create.c:309
#3 0x00007ffff591a88d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
Run Code Online (Sandbox Code Playgroud)
这里 gdb 表示调用堆栈的第一个值位于libgomp.so(OpenMP库)中的某个位置。接下来您可以看到pthread_create.c启动线程的系统相关方法。