【发布时间】:2021-09-25 20:08:07
【问题描述】:
我在某些情况下遇到分段错误(它是使用 DEC VAX FMS(表单管理系统)调用以在 CRT 屏幕上获取某个字段的 C 代码 - 相当旧的遗留代码)。我在 AIX 机器上,并且只安装了 dbx。 GDB、valgrind 等不可用。
这是我尝试调试时得到的结果:
Unreadable instruction at address 0x53484950
我不知道如何从这里开始。
我尝试了一些方法:
1.
(dbx) up
not that many levels
(dbx) down
not that many levels
(dbx) n
where
Segmentation fault in . at 0x53484950 ($t1)
0x53484950 (???) Unreadable instruction at address 0x53484950
-
尝试过 tracei(用于机器指令)、dump(dump 提供了如此多的输出,我无法理解)等,但似乎没有任何帮助。
(dbx) &0x53484950/X
expected variable, found "1397246288"
我习惯于在“哪里”获取堆栈跟踪并从那里继续。这是我以前没有遇到过的,看来我也不太擅长 dbx。任何帮助至少找到导致问题的代码行表示赞赏。
【问题讨论】:
-
对于 1-2,我怀疑您的程序已损坏其堆栈,因此调试器无法找到堆栈帧或有效的调用方返回地址。对于 3,当您没有显示“这么多输出”时,没有人可以帮助您解释它。 4 看起来像语法错误;十六进制 53484950 是十进制 1397246288,如果
&是 dbx 中的地址运算符,那么它告诉您它期望&的操作数是一个变量,而不是一个数字。也许0x53484950/X会起作用。但是,由于堆栈损坏,我预计该数字没有用。您需要在此之前捕获程序。 -
不知何故您将
x'53484950'=c'SHIP'放入$pc很可能您已经覆盖了堆栈上的一个数组。 -
如果源代码不可用,请确保在启动程序之前将终端大小调整为25x80。
-
你是对的。我做错了什么(在我编写的代码中使用了 FMS 调用的指针),这破坏了堆栈,并进一步导致了上述问题。我检查了代码并找到了它,尽管我花了很多时间才弄清楚这一点。