2010-09-06 92 views
3

我有一个程序,由于分段错误而崩溃。核心文件被生成。核心转储不与gdb堆栈跟踪同步

运行在gdb芯给我以下:

HP gdb进行6.1 HP安腾(32或64位)和目标HP-UX的11iv2和11iv3的。

核心是由`gcpf1fwcApp'生成的。
程序以信号6终止,中止。

我用命令

线程应用所有BT

当我检查堆栈跟踪我在主线程这是在等待状态出现错误。

但是,当我在GDB中运行相同的程序时,我得到了一个完全不同的堆栈跟踪错误。这似乎比核心转储更正确。

该程序有31个线程。

为什么我会得到这种差异?

+0

你的程序是多线程的吗?请提供您在GDB中使用的命令。正是您在哪里比较GDB输出?在哪里分析它生产的同一台机器上的核心? – Dummy00001 2010-09-06 12:28:47

+0

是的程序是多线程的。它有31个线程。 我正在比较核心文件产生的背迹和gdb中运行程序的背迹。 我使用的唯一命令是“thread apply all bt”。 我使用gdb像这样:gdb -c 。 是的,它在同一台机器上。 – rahul 2010-09-08 12:02:40

回答

3

有可能你只是在看错误的线程。

尝试thread apply all where,看看其中一个线程是否实际上是abort() ing。

调试实时进程时,GDB将在线程收到SIGABRT时停止,因此可能会显示相关的线程。

调试核心(验尸后)时,GDB不知道哪个线程是相关的,因此无论按照操作系统将其保存到核心的顺序显示给您。 Linux内核保存导致进程死亡的线程,因此Linux上的GDB从内核显示相关的线程。我猜测HP-UX没有这样做,所以GDB会向您显示一个“随机”线程。

+0

是的,我用线程适用于所有bt。首先它不会显示相关的线索。其次,相关的线程并没有显示它已经崩溃。它只是显示它处于线程等待状态。实际线程实际上并没有发生任何线索坠毁。 – rahul 2010-09-08 12:10:23

+0

它总是显示主线程崩溃。 – rahul 2010-09-08 12:16:31