程序集 – 寄存器在gdb分析的核心转储中具有“错误”值

程序集 – 寄存器在gdb分析的核心转储中具有“错误”值,第1张

概述我正在使用gdb分析SIGSEV创建的核心转储文件.我得到了C源代码,但是当我评估表达式时,我得到了正确的值(表达式为 local_var = ((array[index])->field[index2]).field2 其中array是一个全局变量). index和index2的值被优化了(当然:-(),但我计算了几次,每次我得到相同的有效值.绝望之后我检查了反汇编的代码和寄存器并得到了这个: 我正在使用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  5rbx            0x2aaad4096a9c   46913190193820rcx            0x5  5rdx            0x0  0rsi            0xea 234rdi            0xc75000a9   3343909033rbp            0x41f898c0   0x41f898c0rsp            0x41f898a0   0x41f898a0r8             0x2aaacb411c60   46913042848864r9             0x2020202020207475   2314885530818475125r10            0x52203c3c20202020   5917796139299512352r11            0x2b083bb29070   47314361290864r12            0xc75000a9   3343909033r13            0xea 234r14            0x0  0r15            0x2aaad40966a4   46913190192804rip            0x2b083e06d85d   0x2b083e06d85d

因为rdx是0,所以我理解最后一段中的分段错误,因为代码试图从0x28读取,这是无法访问的.我不明白为什么rdx为0?在第一行中,edx获得234值(自该指令起r13寄存器未被修改,这是我计算的索引的有效值).在第三行中,0x2b083e5b6f20(8 * 234)= 0x2b083e5b7670处的8个字节被分配给rdx,但这些字节不是0:

(gdb) x/2 0x2b083e5b76700x2b083e5b7670: 0x3e578900  0x00002b08

rdx如何以0值结束?

我在x86_64 linux上这样做,这是一个多线程程序.这可能是硬件错误吗? SIGSEV并不总是发生.

解决方法

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

听起来你可能有一个数据竞争:在当前线程加载数组[index]) – >字段(当时为0)之后,其他一些线程进来并在那里写了一个不同的值(你现在观察到的新值)核心).

Could this be a harDWare error?

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

总结

以上是内存溢出为你收集整理的程序集 – 寄存器在gdb分析的核心转储中具有“错误”值全部内容,希望文章能够帮你解决程序集 – 寄存器在gdb分析的核心转储中具有“错误”值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1018010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存