地址处不可读的指令

问题描述

我在某些情况下遇到分段错误(它是带有 DEC VAX FMS(表单管理系统)调用的 C 代码,用于在 CRT 屏幕上获取某个字段 - 非常旧的遗留代码)。我在 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
  1. 尝试过 tracei(用于机器指令)、转储(转储提供了太多输出,我无法理解)等,但似乎没有任何帮助。

    (dbx) &0x53484950/X
    expected variable,found "1397246288"

我习惯于在“where”上获取堆栈跟踪并从那里开始。这是我以前没有遇到过的,而且我似乎也不太擅长 dbx。任何帮助至少找到导致问题的代码行的任何帮助表示赞赏。

解决方法

一旦遇到段错误,就无法继续,因此 n 命令不会执行任何操作。此时,您所能做的就是检查堆栈和变量,除非您拥有源代码并且可以重新编译它,否则这将毫无意义。

事实上,如果没有源代码,我不确定您如何继续修复程序。即使您可以“反编译”程序,或者至少可以反汇编程序,但在尝试修补二进制文件以修复它时出错的风险几乎是 100%。

对不起。鉴于您所面临的限制,我认为这个问题是无法解决的。没有gdb或valgind等工具很难发现问题,而没有源代码,一旦发现问题就很难修复。