首页 > 解决方案 > 地址处的不可读指令

问题描述

我在某个场景中遇到分段错误(它是带有 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"

我习惯于在“哪里”获取堆栈跟踪并从那里继续。这是我以前没有遇到过的,看来我也不太擅长 dbx。任何帮助至少找到导致麻烦的代码行表示赞赏。

标签: cdebuggingaixdbxvax

解决方案


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

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

对不起。鉴于您正在工作的限制,我认为这个问题是无法解决的。如果没有 gdb 或 valgind 之类的工具,将很难找到问题,而没有源代码,一旦发现问题,将很难修复。


推荐阅读