f-6ren">
gpt4 book ai didi

assembly - 寄存器在 gdb 分析的核心转储中具有 "wrong"值

转载 作者:行者123 更新时间:2023-12-01 02:19:26 24 4
gpt4 key购买 nike

我正在使用 gdb 分析由 SIGSEV 创建的核心转储文件。我得到了 C 源代码的行号,但是当我评估表达式时,我得到了正确的值(表达式是

local_var = ((array[index])->field[index2]).field2 

哪里 array是一个全局变量)。 index 的值和 index2被优化了(当然 :-( ),但我计算了它们几次,每次都得到相同的有效值。出于绝望,我检查了反汇编的代码和寄存器并得到了这个:
   0x00002b083e06d84c <+142>:   mov    %r13d,%edx          # index (234) to edx
0x00002b083e06d84f <+145>: mov 0x2039fa(%rip),%rax # 0x2b083e271250 (address of array)
0x00002b083e06d856 <+152>: mov (%rax,%rdx,8),%rdx # array[index] (0x2b083e271250+8*234) to rdx
0x00002b083e06d85a <+156>: movslq %ecx,%rax # index2 to rax
=> 0x00002b083e06d85d <+159>: mov 0x28(%rdx),%rdx # array[index]->field to rdx

注释是我对代码的理解。在最后一条指令处接收到 SIGSEV。寄存器的内容:
rax            0x5  5
rbx 0x2aaad4096a9c 46913190193820
rcx 0x5 5
rdx 0x0 0
rsi 0xea 234
rdi 0xc75000a9 3343909033
rbp 0x41f898c0 0x41f898c0
rsp 0x41f898a0 0x41f898a0
r8 0x2aaacb411c60 46913042848864
r9 0x2020202020207475 2314885530818475125
r10 0x52203c3c20202020 5917796139299512352
r11 0x2b083bb29070 47314361290864
r12 0xc75000a9 3343909033
r13 0xea 234
r14 0x0 0
r15 0x2aaad40966a4 46913190192804
rip 0x2b083e06d85d 0x2b083e06d85d

因为 rdx是0,我理解最后一个段的segmentation fault,因为代码试图从 0x28读取这是不可访问的。我不明白的是为什么 rdx是 0?在第一行 edx获取 234值( r13 寄存器自该指令起未修改,这是我计算出的 index 的有效值)。在第三行 0x2b083e5b6f20+(8*234) 处的 8 个字节= 0x2b083e5b7670分配给 rdx ,但这些字节不是 0:
(gdb) x/2 0x2b083e5b7670
0x2b083e5b7670: 0x3e578900 0x00002b08

怎么办 rdx以 0 值结束?

我在 x86_64 Linux 上执行此操作,这是一个多线程程序。这可能是硬件错误吗? SIGSEV 并不总是发生。

最佳答案

this is a multithreaded program. The SIGSEV doesn't happen always.



听起来您可能有数据竞争:加载当前线程后 array[index])->field (当时为 0)其他一些线程进来并在那里写了一个不同的值(您现在观察 core 中的新值)。

Could this be a hardware error?



一切皆有可能,但数据竞争的可能性要高 99.99%。

关于assembly - 寄存器在 gdb 分析的核心转储中具有 "wrong"值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21575138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com