2012-10-18 63 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; 
}