2017-11-25 300 views
-1

我遇到了一個錯誤,而調試我的程序,甚至閱讀彙編代碼 image爲什麼mov指令沒有正確執行?

下面是從GDB的圖像後,我解決不了,0x4070a1之前,%RDX是0x61b130,並且這個數字應該移到-0x18(%rbp)。但是,在這個指令之後,我發現-0x18(%rbp)變成了0x61b7d0,這讓我感到困惑。

由於這個問題,我的程序無法正常運行,誰能告訴我原因?謝謝!

的C代碼:

E_enventry t = E_FunEntry(level,label,NULL,NULL); //t here is 0x61b130 
S_enter(venv,S_Symbol("flush"), t); 
...... 
void S_enter(S_table t, S_symbol sym, void *value) { 
    //while value here is 0x61b7d0 
    TAB_enter(t,sym,value); 
} 
+2

您如何顯示您的C代碼,以便我們可以看到它有什麼問題? – dbush

+0

歡迎來到stackoverflow.com。請花些時間閱讀[幫助頁面](http://stackoverflow.com/help),尤其是名爲[「我可以問些什麼話題?」]的章節(http://stackoverflow.com/help/)討論話題)和[「我應該避免問什麼類型的問題?」](http://stackoverflow.com/help/dont-ask)。還請[參觀](http://stackoverflow.com/tour)和[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。最後,請學習如何創建[最小,**完整**和可驗證示例](http://stackoverflow.com/help/mcve)。 –

+0

@dbush謝謝,我在問題中加入了它,但我認爲C代碼沒有意義,它很奇怪。 –

回答

2

p/x $rdx表示0x61b130是沒有意義的。顯示功能輸入值value的堆棧框架內容與您在內存中看到的內容相匹配,並在存儲後與x匹配。

我認爲你的GDB是越野車,但它顯示錯誤的東西可能是$rdx的值,因爲這與其他兩個來源不一致。 (並根據您的意見,也不符合溢出/重新加載後p/x $rdx)。

嘗試不同版本的gdb,或嘗試使用不同的調試器(這不是GDB的前端)。例如嘗試lldb


從堆棧溢出/重裝所有3個參數傳遞給/後,最終使一個函數調用TAB_enter與C源的前3 ARGS相同的,並且所述第四ARG = 2RD ARG(sym

或者,也許沒有第四個參數,它只是使用%rcx作爲臨時代替直接加載到%rsi,就像它使用%rax一樣。

gcc -O0極其新空房禁地,並且只有一些是故意(溢出/重載C語句之間的所有內容以支持修改存儲器變量與調試器,或源極線之間的連跳。)

TL :DR:不出所料,您所展示的asm正好實現了您爲void S_enter(S_table t, S_symbol sym, void *value)展示的來源,不多也不少。

+0

@ T.Chen:您是否安裝了任何信號處理程序?或者其他任何會異步修改你的進程的寄存器或內存的東西?我一直在看你的gdb會話,它沒有任何意義。你可以在不同的運行中重現這一點嗎?什麼值重新加載回'%rdx'? –

+0

不,只有一個線程,我沒有添加任何信號處理程序。結果每次都是一樣的。 –

+0

@ T.Chen:可能你的'gdb'是越野車嗎?也許嘗試一個不同的調試器,比如'lldb'。請注意,即使在將堆棧幀信息存儲到堆棧之前,堆棧幀信息也具有「value = 0x61b7d0」,因此它具有正確的「%rdx」值。 –