分段错误 - 调试程序集gdb

时间:2015-06-29 02:19:28

标签: c debugging assembly linux-kernel 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-&gt; cp和q-&gt; tq-&gt; 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-&gt; cp,q-&gt; tq-&gt; 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

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

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

1 个答案:

答案 0 :(得分:0)

p =&amp; v [QUEUE]

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

所以使用

p =&amp; v [QUEUE-1]

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

p = v