- 假设我可以从其中确定崩溃位置的核心转储
- 失败模块的objdump通过重新编译为
- 选项
的模块的汇编程序清单。
是否可能与源代码进行一对一的对应?
例如, 我看到汇编清单如下:
.LBE7923:
.loc 2 4863 0
movq %rdi, %r14
movl %esi, %r12d
movl 696(%rsp), %r15d
movq 704(%rsp), %rbp
.LBB7924:
.loc 2 4880 0
testq %rdx, %rdx
je .L2680
.LVL2123:
testl %ecx, %ecx
jle .L2680
movslq %ecx,%rax
.loc 2 4882 0
testl %r15d, %r15d
.loc 2 4880 0
leaq (%rax,%rax,4), %rax
leaq -40(%rdx,%rax,8), %rdx
movq %rdx, 64(%rsp)
但是我不知道如何解释类似.LVL2123
和指令.loc 2 4863 0
这样的标签。
注意:
正如答案所示,通过阅读汇编源代码并根据符号(如函数调用、分支、返回语句)直观地确定模式是我通常做的。我不否认它不起作用,但当一个函数很复杂时,阅读页数的汇编清单是一种痛苦,经常会出现清单不匹配的情况,因为函数被内联或者优化器随意扔掉了代码。我有一种感觉,看到Valgrind
如何高效处理优化后的二进制文件,以及在Windows中WinDBG
如何处理优化后的二进制文件,我错过了什么。所以我想从编译器输出开始使用它来进行相关性分析。如果我的编译器负责搞乱二进制文件,它将是最好的人来说明如何与源代码相关联,但不幸的是,这对我没有帮助,.loc
实际上是非常误导人的。
不幸的是,我经常不得不阅读各种平台上无法重现的转储,并且我在调试Windows Mini-dumps上花费的时间最少,而在调试Linux Coredumps上花费的时间相当长。我认为可能是我做事情不正确,所以我提出了这个问题。
addr2line
程序将其翻译成源代码位置。当然,这需要具备调试符号的可执行文件(即使您的分发版本已经剥离了符号信息,只需与未剥离版本进行比较也可以运行)。 - edA-qa mort-ora-y