1

我无法调试从 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?)
如何获取有效信息?

4

1 回答 1

1

转储寄存器并找到 iar。然后看看是否可以将 iar 指向的地址转储为代码和 ascii。如果您在 C 代码中(而不是 ctr0 或一些晦涩的库),则函数的名称将位于函数的底部。

然后,您可以为该函数设置断点,也可以为 iar 所在位置之前的一两条指令设置断点。我还会运行它六次,看看 iar 是否始终在同一个地方。

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

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

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

我能想到的唯一特定于 AIX 的调整是确保您已打开全核: lsattr -Elsys0 -a fullcore 但如果您从 gdb 运行它,那没关系。

最后:如果您确实找到了 iar 并解码了它指向的指令,那么查看该指令所引用的寄存器,这将告诉您究竟是什么导致了故障(从您无法触摸的某个地方加载或存储到无法修改的地方)。这可能会为您提供有关您在程序中的位置以及出了什么问题的线索。

祝你好运

于 2013-05-12T03:47:09.343 回答