作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
f-6ren">
我正在使用 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
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 值结束?
最佳答案
this is a multithreaded program. The SIGSEV doesn't happen always.
array[index])->field
(当时为 0)其他一些线程进来并在那里写了一个不同的值(您现在观察
core
中的新值)。
Could this be a hardware error?
关于assembly - 寄存器在 gdb 分析的核心转储中具有 "wrong"值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21575138/
我是一名优秀的程序员,十分优秀!