簡體   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