问题描述
我在某些情况下遇到分段错误(它是带有 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
-
尝试过 tracei(用于机器指令)、转储(转储提供了太多输出,我无法理解)等,但似乎没有任何帮助。
(dbx) &0x53484950/X
expected variable,found "1397246288"
我习惯于在“where”上获取堆栈跟踪并从那里开始。这是我以前没有遇到过的,而且我似乎也不太擅长 dbx。任何帮助至少找到导致问题的代码行的任何帮助表示赞赏。
解决方法
一旦遇到段错误,就无法继续,因此 n 命令不会执行任何操作。此时,您所能做的就是检查堆栈和变量,除非您拥有源代码并且可以重新编译它,否则这将毫无意义。
事实上,如果没有源代码,我不确定您如何继续修复程序。即使您可以“反编译”程序,或者至少可以反汇编程序,但在尝试修补二进制文件以修复它时出错的风险几乎是 100%。
对不起。鉴于您所面临的限制,我认为这个问题是无法解决的。没有gdb或valgind等工具很难发现问题,而没有源代码,一旦发现问题就很难修复。