c++ - 在 gdb 中使用 coredump 时,我如何确切知道哪个线程导致了 SIGSEGV?

标签 c++ c segmentation-fault gdb coredump

这个问题在这里已经有了答案:





How to find which thread caused SEGFAULT in a post-mortem gdb session?

(1 个回答)


7年前关闭。




我的应用程序使用超过 8 个线程。当我运行 info threads在 gdb 中,我看到了线程和它们正在执行的最后一个函数。对我来说,究竟哪个线程导致了 SIGSEGV 似乎并不明显。可以告诉它吗?是线程1吗?线程如何编号?

最佳答案

当您使用 gdb分析核心转储文件 gdb将在导致程序核心转储的函数处停止。而当前的线索将是谋杀。以下面的程序为例:

#include <stdio.h>
#include <pthread.h>
void *thread_func(void *p_arg)
{
        while (1)
        {
                printf("%s\n", (char*)p_arg);
                sleep(10);
        }
}
int main(void)
{
        pthread_t t1, t2;

        pthread_create(&t1, NULL, thread_func, "Thread 1");
        pthread_create(&t2, NULL, thread_func, NULL);

        sleep(1000);
        return;
}
t2线程将导致程序停机,因为它引用了 NULL指针。程序下来后,使用gdb分析核心转储文件:
[root@localhost nan]# gdb -q a core.32794
Reading symbols from a...done.
[New LWP 32796]
[New LWP 32795]
[New LWP 32794]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `./a'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000034e4281451 in __strlen_sse2 () from /lib64/libc.so.6
(gdb)
gdb停在 __strlen_sse2函数,这意味着该函数导致程序停机。然后使用 bt命令查看它是由哪个线程调用的:
(gdb) bt
#0  0x00000034e4281451 in __strlen_sse2 () from /lib64/libc.so.6
#1  0x00000034e4268cdb in puts () from /lib64/libc.so.6
#2  0x00000000004005cc in thread_func (p_arg=0x0) at a.c:7
#3  0x00000034e4a079d1 in start_thread () from /lib64/libpthread.so.0
#4  0x00000034e42e8b6d in clone () from /lib64/libc.so.6
(gdb) i threads
  Id   Target Id         Frame
  3    Thread 0x7ff6104c1700 (LWP 32794) 0x00000034e42accdd in nanosleep () from /lib64/libc.so.6
  2    Thread 0x7ff6104bf700 (LWP 32795) 0x00000034e42accdd in nanosleep () from /lib64/libc.so.6
* 1    Thread 0x7ff60fabe700 (LWP 32796) 0x00000034e4281451 in __strlen_sse2 () from /lib64/libc.so.6
bt命令显示当前线程的堆栈帧(这是谋杀)。 “i threads”命令显示所有线程,以*开头的线程号是当前线程。

至于“How are the threads numbered?”,取决于操作系统。你可以引用gdb manual了解更多信息。

关于c++ - 在 gdb 中使用 coredump 时,我如何确切知道哪个线程导致了 SIGSEGV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63130344/

相关文章:

c++ - 为日志记录重载 << 运算符的设计的潜在问题

c - 使用 union/struct 成员作为 gcc 内联 asm 参数

c++ - 仅在多核上运行时出现段错误

c++ - 介子和 Eigen 的文件路径问题

c++ - 免费的 Pascal/C++ 项目在 cout::sentry 中崩溃

c++ - 在运行时使用用户定义的文字

c - C中如何根据索引获取子字符串

c - gtk_menu_item_new_with_labelex 与 gtk_menu_item_new_with_label

c - 读取数据文件并帮助纠正程序

c++ - 按位异或以 SIGSEGV 结束