GDB:如何在AIX机器上调试核心文件

时间:2013-05-11 06:33:46

标签: c gdb aix

我无法调试从AIX机器生成的核心文件。

uname -a
AIX dev 1 6
file /usr/bin/ld
/usr/bin/ld: executable (RISC System/6000) or object module

oslevel -g
Fileset - bos.rte
Actual Level - 6.1.7.15

以下是生成的核心文件中的gdb跟踪。

gdb A_CustInstr core
This GDB was configured as "powerpc-ibm-aix5.1.0.0".
Core was generated by A_CustInstr. Program terminated with signal 11, Segmentation fault.
#0 0x09000000007e4b70 in ?? ()
(gdb) bt
#0 0x09000000007e4b70 in ?? ()
#1 0xffffffffffffffff in ?? ()
#2 0x09000000007e43ec in ?? ()
#3 0x090000000002bab0 in ?? ()
#4 0x09000000033940c0 in ?? ()
#5 0x0900000003400d54 in ?? ()
#6 0x0900000003394444 in ?? ()
#7 0x00000000000047e0 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
如何获得有效信息?

1 个答案:

答案 0 :(得分:1)

转储寄存器并找到iar。然后看看你是否可以将iar指向的地址转储为代码,也可以转换为ascii。如果您使用的是C代码(而不是ctr0或某些不明显的库),则函数的名称将位于函数的底部。

然后你可以为该函数设置一个断点,或者你可以在一个或两个指令之前设置一个断点。我也会跑半打,看看iar是否一直在同一个地方。

我没有足够使用gdb来了解我刚刚描述的命令和语法。

您可能需要在不进行优化的情况下重新编译,以便了解代码的作用。

如果iar证明完全无用,请查看lr。如果这也没用,那么手动开始解码堆栈。 r1指向堆栈帧。 r1 [0]是指向下一个堆栈帧的指针。 r1 [2]是返回地址。在优化代码的情况下,第一个堆栈帧的返回地址可能无效。如果所有这些都失败了,那么你将不得不使用gdb或printf来回溯。

我能想到的唯一的AIX特定调整是确保你打开了fullcore:lsattr -Elsys0 -a fullcore但是如果你从gdb运行它,那就不重要了。

最后:如果你确实找到了iar并解码它所指向的指令,那么请查看指令所引用的寄存器,这将告诉你究竟是什么导致了错误(从某个地方加载你可以'触摸或存储到某个地方,你无法修改)。这可能会让您了解您在计划中的位置以及出现的问题。

祝你好运