【发布时间】:2019-06-30 06:01:43
【问题描述】:
我编译文件stacktrace.d:
void main(){assert(false);} 关闭了 ASLR,运行时我得到:
core.exception.AssertError@stacktrace.d(2): Assertion failure
----------------
??:? _d_assertp [0x55586ed8]
??:? _Dmain [0x55586e20]
objdump -t stacktrace|grep _Dmain给了
0000000000032e0c w F .text 0000000000000019 _Dmain
如果我运行gdb -q -nx -ex start -ex 'disas /rs _Dmain' -ex q stacktrace:
...
Dump of assembler code for function _Dmain:
0x0000555555586e0c <+0>: 55 push %rbp
0x0000555555586e0d <+1>: 48 8b ec mov %rsp,%rbp
=> 0x0000555555586e10 <+4>: be 02 00 00 00 mov $0x2,%esi
0x0000555555586e15 <+9>: 48 8d 3d 44 c0 02 00 lea 0x2c044(%rip),%rdi # 0x5555555b2e60 <_TMP0>
0x0000555555586e1c <+16>: e8 47 00 00 00 callq 0x555555586e68 <_d_assertp>
0x0000555555586e21 <+21>: 31 c0 xor %eax,%eax
0x0000555555586e23 <+23>: 5d pop %rbp
0x0000555555586e24 <+24>: c3 retq
因此,即使前两个 0x55 字节被截断,堆栈跟踪中给出的 0x...86e20 也不匹配指令的开头。
【问题讨论】:
-
这可能是你的问题。返回地址被 1 位损坏。硬件内存故障?
-
我认为运行时代码只是从它保留的值中减去一个以显示异常的源代码行号而不是源代码的下一行(
call指令推送下一条指令的地址,直接读取会给出错误的行号)。但我无法证明这一点,我现在没有在源代码中看到它,所以我不想将它作为答案发布。