clang+llvm多进程gdb调试

clang+llvm多进程gdb调试

  • 前言
  • [1. 命令行gdb](#1. 命令行gdb)
  • [2. 父进程调试](#2. 父进程调试)
  • [3. 子进程调试](#3. 子进程调试)
  • [4. 返回父进程](#4. 返回父进程)

前言

在学习新增llvm的优化pass时,需要跟踪clang及llvm的调用栈。然而llvm通过posix_spawn()创建了新进程,这使得gdb调试必须有一定的技巧了。

1. 命令行gdb

以下命令通过clang调用新增优化pass(指令替换),将simple.c文件中的sum函数替换掉:

bash 复制代码
clang -flegacy-pass-manager -mllvm -sub -mllvm -sub_loop=1 -mllvm -sub_name=sum mvc.o simple.c -o simple

单步调试的命令为:

bash 复制代码
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的解释是:

ebugger 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模式:

bash 复制代码
(gdb) set follow-fork-mode child
(gdb) set detach-on-fork off

4. 返回父进程

利用inferior命令,可以切换进程:

bash 复制代码
(gdb) info inferiors
(gdb) inferior 1
相关推荐
Zevalin爱灰灰15 小时前
JTAG/SWD是什么
gdb·调试
ttkwzyttk14 天前
GDB TUI窗口管理
gdb
ttkwzyttk14 天前
GDB观察点与捕获点使用
gdb
ttkwzyttk20 天前
GDB函数调用栈管理
gdb
ttkwzyttk21 天前
GDB调试变量、内存与寄存器查看与修改
gdb
ttkwzyttk21 天前
GDB调试简介与调试配置
gdb
modelmd1 个月前
GDB 摘要
gdb
源分享1 个月前
GDB下载和安装保姆级教程
gdb
modelmd2 个月前
翻译 GDB 官方文档
gdb
kidwjb2 个月前
一次多进程信号量同步失效的排查实录
gdb·进程通信·信号量