我有一个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 –