繁体   English   中英

分段错误 - 调试程序集gdb

[英]Segmentation fault - Debugging assembly gdb

我正在调试分段错误。 以下是在ff_printf调用时出现故障的代码段。

for (p = &v[QUEUE], i = 0; i < p->used; i++) {
        queue_t *q = p->data[i];
        ff_printf(F_DB, "  %02u %s\n",
            p->cp, q->tq->queue_name);
    }

seg故障位于ff_printf行。 当我通过gdb调试时,我可以解析p-> cp和q-> tq-> queue_name。 F_DB也得到解决,因为它是一个枚举。 因此,由于无效的差异,它没有出错。

在反汇编代码之后,我得到了ff_printf行的上面代码片段的汇编。

   0x0000000000449b88 <+360>:   mov    -0x14(%r13),%rax
   0x0000000000449b8c <+364>:   movzwl %r10w,%edx

   0x0000000000449b90 <+368>:   movzwl (%rbx),%r9d
   0x0000000000449b94 <+372>:   mov    $0x56a4d9,%r8d
   0x0000000000449b9a <+378>:   mov    $0x5,%ecx
   0x0000000000449b9f <+383>:   mov    $0x5bb,%esi
   0x0000000000449ba4 <+388>:   mov    $0x56a27b,%edi
   0x0000000000449ba9 <+393>:   mov    (%rax,%rdx,8),%rax
   0x0000000000449bad <+397>:   mov    $0x56aec0,%edx
=> 0x0000000000449bb2 <+402>:   mov    0x88(%rax),%rax
   0x0000000000449bb9 <+409>:   mov    %r10d,-0x48(%rbp)
   0x0000000000449bbd <+413>:   mov    %rax,(%rsp)
   0x0000000000449bc1 <+417>:   xor    %eax,%eax
   0x0000000000449bc3 <+419>:   callq  0x4423c0 <ff_printf>

现在,我调试了寄存器并使用代码片段进行了验证。 我能够通过程序集调试(即通过寄存器)获得F_DB,p-> cp,q-> tq-> queue_name。 我发现%rax的值是0x0。 我观察到seg故障发生在调用ff_printf库之前。

我有两个问题:

1:我如何映射这个

"    => 0x0000000000449bb2 <+402>:  mov    0x88(%rax),%rax" 

到代码片段?

我观察到%rax已经填满了

0x0000000000449b88 <+360>:  mov    -0x14(%r13),%rax

我认为它是mov($ r13的地址 - 0x14)到%rax。

0x0000000000449ba9 <+393>:  mov    (%rax,%rdx,8),%rax

我认为它是mov(地址$ rax +地址$ rdx + 8)到%rax。 我对吗 ?

2:我不确定是否有任何堆栈损坏。 这段错误是非常罕见的,我无法重现它。 如何从这里进一步回溯呢?

p =&v [QUEUE]

是错误的,如果QUEUE是v的大小,因为它的索引范围从零到QUEUE-1。

所以使用

p =&v [QUEUE-1]

或者,如果您想从v的开头开始,请使用

p = v

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM