我正在调试分段错误。以下是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:我不确定是否有任何堆栈损坏。这段错误是非常罕见的,我无法重现它。如何从这里进一步回溯?
答案 0 :(得分:0)
p =&amp; v [QUEUE]
是错误的,如果QUEUE是v的大小,因为它的索引范围从零到QUEUE-1。
所以使用
p =&amp; v [QUEUE-1]
或者,如果您想从v的开头开始,请使用
p = v