我有一個while
循環如下。如何使用gdb進入while循環?
while (*d++ = *sc++)
正如我希望理解部門指針我想進入while
環和理解while
迴路是如何工作與指針。
我用step
在gdb
但它並沒有完全進入while
循環。是否有任何方法可以進入while
循環,並瞭解每步驟中中的操作。
我有一個while
循環如下。如何使用gdb進入while循環?
while (*d++ = *sc++)
正如我希望理解部門指針我想進入while
環和理解while
迴路是如何工作與指針。
我用step
在gdb
但它並沒有完全進入while
循環。是否有任何方法可以進入while
循環,並瞭解每步驟中中的操作。
*
綁定更緊然後postfix ++
。 ++
右側將最後應用,所以:
while (*d++ = *sc++)
是一樣的:
while (*d = *sc)
{
d++;
sc++;
的修改是更好的gdb
被跟蹤。
更新:
不要這樣的代碼OP!
雖然它看起來很酷,並且證明你很聰明。這是很難被普通的人類大腦解析,因此容易出錯?我們不想要的,是嗎?
更好的辦法是獲得上面提出的更清晰的替代方案,並讓編譯器對代碼進行加擾。
我完全同意。着名的引言總結了這一點:''調試比編寫代碼要困難一倍,因此,如果您儘可能巧妙地編寫代碼,那麼根據定義,您的調試不夠聰明。「 -Brian Kernighan' – Lundin
@Lundin,在他的着作「經驗豐富的C程序員會喜歡...」中寫下同樣的Keringham(* s ++ = * t ++);'......雖然這看起來似乎很神祕,注意便利性是相當大的,並且應該掌握這個習語,因爲你會在程序中經常看到它。「 (有所釋義,「C編程語言」,第5.5節)? – ugoren
@ugoren的確,他自己並沒有掌握正確的編碼風格,因爲正確的編碼風格甚至在編寫K&R書時都沒有發明。這本書充滿了非常糟糕的編碼風格例子。所以你必須閱讀他的陳述:「經驗豐富的C程序員自70年代中期以來一直處於昏迷狀態,並且剛剛醒來會更喜歡......」 – Lundin
選項1: 按照Olaf Dietsche的建議查看assembly code debugging。
選項2: 使用gcc -S test.c
在彙編後停止編譯器以查看程序的彙編代碼。瞭解彙編代碼可能有點困難。更多信息here
方案3: 重寫你的程序像
while(1)
{
if(*d++ != *sc++)
{
break;
}
}
所以,你可以把斷點和查看更改的值。
的替代,而是寫的代碼相同的方式是:
*d = *sc;
while (*d > 0)
{
d++;
sc++;
*d = *sc;
}
你需要看的彙編代碼。請參閱:http://stackoverflow.com/questions/589653/switching-to-assembly-in-gdb –