2012-10-18 123 views
0

我有一個while循環如下。如何使用gdb進入while循環?

while (*d++ = *sc++) 

正如我希望理解部門指針我想進入while環和理解while迴路是如何工作與指針。

我用stepgdb但它並沒有完全進入while循環。是否有任何方法可以進入while循環,並瞭解每步驟中中的操作。

+1

你需要看的彙編代碼。請參閱:http://stackoverflow.com/questions/589653/switching-to-assembly-in-gdb –

回答

4

*綁定更緊然後postfix ++++右側將最後應用,所以:

while (*d++ = *sc++) 

是一樣的:

while (*d = *sc) 
{ 
    d++; 
    sc++; 

的修改是更好的gdb被跟蹤。

更新:

不要這樣的代碼OP!

雖然它看起來很酷,並且證明你很聰明。這是很難被普通的人類大腦解析,因此容易出錯?我們不想要的,是嗎?

更好的辦法是獲得上面提出的更清晰的替代方案,並讓編譯器對代碼進行加擾。

+1

我完全同意。着名的引言總結了這一點:''調試比編寫代碼要困難一倍,因此,如果您儘可能巧妙地編寫代碼,那麼根據定義,您的調試不夠聰明。「 -Brian Kernighan' – Lundin

+3

@Lundin,在他的着作「經驗豐富的C程序員會喜歡...」中寫下同樣的Keringham(* s ++ = * t ++);'......雖然這看起來似乎很神祕,注意便利性是相當大的,並且應該掌握這個習語,因爲你會在程序中經常看到它。「 (有所釋義,「C編程語言」,第5.5節)? – ugoren

+1

@ugoren的確,他自己並沒有掌握正確的編碼風格,因爲正確的編碼風格甚至在編寫K&R書時都沒有發明。這本書充滿了非常糟糕的編碼風格例子。所以你必須閱讀他的陳述:「經驗豐富的C程序員自70年代中期以來一直處於昏迷狀態,並且剛剛醒來會更喜歡......」 – Lundin

3

選項1: 按照Olaf Dietsche的建議查看assembly code debugging

選項2: 使用gcc -S test.c在彙編後停止編譯器以查看程序的彙編代碼。瞭解彙編代碼可能有點困難。更多信息here

方案3: 重寫你的程序像

while(1) 
{ 
    if(*d++ != *sc++) 
    { 
     break; 
    } 
} 

所以,你可以把斷點和查看更改的值。

+0

我嘗試了第三個選項,仍然不服氣。我想我需要深入討論組裝 – Shash

+0

我想說深入瞭解最好的方法是選項1。 – CCoder

0

的替代,而是寫的代碼相同的方式是:

*d = *sc; 
while (*d > 0) 
{ 
    d++; 
    sc++; 
    *d = *sc; 
}