[英]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.