clang+llvm多进程gdb调试

本文介绍了如何在clang+llvm项目中,通过gdb进行多进程调试,包括命令行gdb的使用,父进程和子进程的调试方法,以及在vscode中设置.inc文件高亮。

前言

在学习新增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的项目。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值