为什么GDB在使用c源代码进行调试时会"跳回"

dai*_*isy 4 debugging android gdb kernel

我正在使用内核源代码调试金鱼安卓内核(版本3.4).

现在我发现gdb有时会在行之间来回跳转,例如考虑如下的c源代码:

char *XXX;
int a;
...

if (...)
{

}
Run Code Online (Sandbox Code Playgroud)

当我到达该if条款时,我输入n并将跳回到该int a部分.这是为什么?

如果我再次执行该命令,它将输入中的括号if.

如果可能的话,我想避免那部分,并直接输入if(当然,如果条件匹配)

Emp*_*ian 7

当我到达if子句时,我输入n并且它将跳回到int的一部分.这是为什么?

因为您的代码是通过优化编译的,并且编译器可以(并且经常)以这样的方式重新排列程序的指令:"属于"不同源行的指令是交错的(代码运动优化尝试(除其他外)在需要结果之前很久就将加载指令移动;这有助于隐藏内存延迟.

如果您使用gcc-4.8或以后使用,请使用-Og.否则,请看这个答案.