clang+llvm多进程gdb调试
2023-12-13 09:32:29
前言
在学习新增llvm的优化pass时,需要跟踪clang及llvm的调用栈。然而llvm通过posix_spawn()
创建了新进程,这使得gdb调试必须有一定的技巧了。
1. 命令行gdb
以下命令通过clang调用新增优化pass(指令替换),将simple.c文件中的sum函数替换掉:
clang -flegacy-pass-manager -mllvm -sub -mllvm -sub_loop=1 -mllvm -sub_name=sum mvc.o simple.c -o simple
单步调试的命令为:
gdb --args clang -flegacy-pass-manager -mllvm -sub -mllvm -sub_loop=1 -mllvm -sub_name=sum mvc.o simple.c -o simple
实际上,在我的ubuntu下clang指向clang-13
2. 父进程调试
从调用栈可知,clang::driver::Command::Execute()调用了llvm::sys::ExecuteAndWait(),从而联系了clang模块和llvm模块。我们新增的优化pass正是llvm模块的代码。
如何才能在posix_spawn()函数创建子进程后,观察子进程的执行情况呢?
3. 子进程调试
follow-fork-mode的解释是:
Debugger response to a program call of fork or vfork
detach-on-fork的解释是:
Whether gdb will detach the child of a fork
根据下列博文https://blog.51cto.com/u_12740336/6252279,具体组合用途如下:
在本案例的使用中,需要设置成child+off模式:
(gdb) set follow-fork-mode child
(gdb) set detach-on-fork off
至此可以正常调试子进程:
4. 返回父进程
利用inferior命令,可以切换进程:
(gdb) info inferiors
(gdb) inferior 1
5. .inc文件高亮
这是一个题外话,且记载在这里。我用vscode看代码,默认时无法高亮*.inc文件,我知道在llvm工程中这个后缀的文件是作为c++语法使用的。
那么设置方法是,在vscode中点击Settings、TextEditor、Files、Associations,新增Item为*.inc
、Value为cpp
的项目。
文章来源:https://blog.csdn.net/B10030607/article/details/134555240
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!