clang+llvm多進程gdb調試
- 前言
- 1. 命令行gdb
- 2. 父進程調試
- 3. 子進程調試
- 4. 返回父進程
前言
在學習新增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的解釋是:
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模式:
(gdb) set follow-fork-mode child
(gdb) set detach-on-fork off
4. 返回父進程
利用inferior命令,可以切換進程:
(gdb) info inferiors
(gdb) inferior 1