Debugging LLVM如何处理continue关键字和右大括号的调试位置信息?
让我向您展示以下简单的C代码:Debugging LLVM如何处理continue关键字和右大括号的调试位置信息?,debugging,clang,llvm,Debugging,Clang,Llvm,让我向您展示以下简单的C代码: int main() { int i; for (i = 0; i < 256; i++) { i++; } } intmain() { int i; 对于(i=0;i
int main()
{
int i;
for (i = 0; i < 256; i++)
{
i++;
}
}
intmain()
{
int i;
对于(i=0;i<256;i++)
{
i++;
}
}
在这个简单的C代码中,如果我们使用Clang编译并调试它:
我们将得到如下结果:
(gdb) b main
Breakpoint 1 at 0x100000f7b: file a.c, line 5.
(gdb) r
Starting program: a.out
[New Thread 0x1403 of process 23435]
warning: unhandled dyld version (15)
Thread 2 hit Breakpoint 1, main () at a.c:5
5 for (i = 0; i < 256; i++)
(gdb) n
7 i++;
(gdb)
5 for (i = 0; i < 256; i++)
(gdb)
7 i++;
(gdb)b main
断点1位于0x10000F7B:文件a.c,第5行。
(gdb)r
启动程序:a
[进程23435的新线程0x1403]
警告:未处理的dyld版本(15)
线程2在a.c:5处命中断点1,main()
5表示(i=0;i<256;i++)
(gdb)n
7i++;
(gdb)
5表示(i=0;i<256;i++)
(gdb)
7i++;
也就是说,位置LLVM的右括号不发出。但是,如果我们有continue关键字:
int main()
{
int i;
for (i = 0; i < 256; i++)
{
continue;
i++;
}
}
intmain()
{
int i;
对于(i=0;i<256;i++)
{
继续;
i++;
}
}
然后我们编译并调试它:
Thread 2 hit Breakpoint 1, main () at a.c:5
5 for (i = 0; i < 256; i++)
(gdb) n
7 continue;
(gdb)
5 for (i = 0; i < 256; i++)
(gdb)
7 continue;
(gdb)
5 for (i = 0; i < 256; i++)
(gdb)
7 continue;
线程2在a.c:5处命中断点1,main()
5表示(i=0;i<256;i++)
(gdb)n
7继续;
(gdb)
5表示(i=0;i<256;i++)
(gdb)
7继续;
(gdb)
5表示(i=0;i<256;i++)
(gdb)
7继续;
我们将停止生产线继续生产。但如果我们比较它们之间的LLVM IR:
右大括号和continue关键字都在br指令和下面!dbg!23除了行号!dbg!23不一样
:6: ; preds=%3
br标签%7!dbg!二十三
问题是LLVM如何知道是否生成调试位置(为continue关键字行生成,但不为循环的右大括号生成)?因为它们是相同的指令,而其他指令是相同的。大括号只是一个语法作用域,编译器在以下方面没有区别:
for (i = 0; i < 256; i++)
{
i++;
}
(i=0;i<256;i++)的
{
i++;
}
及
(i=0;i<256;i++)的
i++;
解析器正在使用您创建的作用域将语句组合在一起,但这不会出现在LLVM IR中。LLVM IR表示程序需要执行的更多指令
在调试器中使用n
时,要求继续执行程序,直到到达与不同源代码行对应的指令。大括号不对应于可执行文件中的任何指令
for (i = 0; i < 256; i++)
i++;