# 一個gdb會話中同時調試多個程序
## 例子
a.c:
#include <stdio.h>
int func(int a, int b)
{
int c = a * b;
printf("c is %d\n", c);
}
int main(void)
{
func(1, 2);
return 0;
}
b.c:
#include <stdio.h>
int func1(int a)
{
return 2 * a;
}
int func2(int a)
{
int c = 0;
c = 2 * func1(a);
return c;
}
int func3(int a)
{
int c = 0;
c = 2 * func2(a);
return c;
}
int main(void)
{
printf("%d\n", func3(10));
return 0;
}
## 技巧
gdb支持在一個會話中同時調試多個程序。以上面程序為例,首先調試`a`程序:
root@bash:~$ gdb a
GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a...done.
(gdb) start
Temporary breakpoint 1 at 0x400568: file a.c, line 10.
Starting program: /home/nanxiao/a
接著使用“`add-inferior [ -copies n ] [ -exec executable ]`”命令加載可執行文件`b`。其中`n`默認為1:
(gdb) add-inferior -copies 2 -exec b
Added inferior 2
Reading symbols from b...done.
Added inferior 3
Reading symbols from b...done.
(gdb) i inferiors
Num Description Executable
3 <null> /home/nanxiao/b
2 <null> /home/nanxiao/b
* 1 process 1586 /home/nanxiao/a
(gdb) inferior 2
[Switching to inferior 2 [<null>] (/home/nanxiao/b)]
(gdb) start
Temporary breakpoint 2 at 0x400568: main. (3 locations)
Starting program: /home/nanxiao/b
Temporary breakpoint 2, main () at b.c:24
24 printf("%d\n", func3(10));
(gdb) i inferiors
Num Description Executable
3 <null> /home/nanxiao/b
* 2 process 1590 /home/nanxiao/b
1 process 1586 /home/nanxiao/a
可以看到可以調試`b`程序了。
另外也可用“`clone-inferior [ -copies n ] [ infno ]`”克隆現有的`inferior`,其中`n`默認為1,`infno`默認為當前的`inferior`:
(gdb) i inferiors
Num Description Executable
3 <null> /home/nanxiao/b
* 2 process 1590 /home/nanxiao/b
1 process 1586 /home/nanxiao/a
(gdb) clone-inferior -copies 1
Added inferior 4.
(gdb) i inferiors
Num Description Executable
4 <null> /home/nanxiao/b
3 <null> /home/nanxiao/b
* 2 process 1590 /home/nanxiao/b
1 process 1586 /home/nanxiao/a
可以看到又多了一個`b`程序。
參見[gdb手冊](https://sourceware.org/gdb/onlinedocs/gdb/Inferiors-and-Programs.html).
## 貢獻者
nanxiao
- 版權
- 內容
- 調整窗口大小
- 一個gdb會話中同時調試多個程序
- 調試已經運行的進程
- 在匿名空間設置斷點
- 在程序地址上打斷點
- 在程序入口處打斷點
- 在函數的第一條匯編指令打斷點
- 在文件行號上打斷點
- 使用斷點命令改變程序的執行
- 直接執行函數
- 為exec調用設置catchpoint
- 為fork調用設置catchpoint
- 為ptrace調用設置catchpoint
- 為系統調用設置catchpoint
- 為vfork調用設置catchpoint
- 改變字符串的值
- 配置gdb init文件
- 設置源文件查找路徑
- 自動反匯編后面要執行的代碼
- 顯示程序原始機器碼
- 顯示將要執行的匯編指令
- 打印內存的值
- 退出正在調試的函數
- 為調試進程產生core dump文件
- 得到命令的幫助信息
- 忽略斷點
- 信息顯示
- 打印函數堆棧幀信息
- 列出函數的名字
- 查看信號處理信息
- 顯示共享鏈接庫信息
- 跳轉到指定位置執行
- 顯示匯編代碼窗口
- 顯示寄存器窗口
- 加載可執行程序和core dump文件
- 打印程序進程空間信息
- 在Solaris上使用maintenance命令查看線程信息
- 將源程序和匯編指令映射起來
- 修改PC寄存器的值
- 命令行選項的格式
- 信號發生時是否把信號丟給程序處理
- 修改被調試程序的二進制文件
- 支持預處理器宏信息
- 打印STL容器中的內容
- 打印數組的索引下標
- 打印ASCII和寬字符字符串
- 打印數組中任意連續元素值
- 按照派生類型打印對象
- 打印調用棧幀中變量的值
- 打印大數組中的內容
- 打印函數局部變量的值
- 打印程序動態分配內存的信息
- 打印進程內存信息
- 打印寄存器的值
- 信號發生時是否打印信號信息
- 打印源代碼行
- 打印靜態變量的值
- 查看線程信息
- 打印變量的類型和所在文件
- gdb退出時不顯示提示信息
- 在gdb中執行cd和pwd命令
- 在gdb中執行shell命令和make
- 保存已經設置的斷點
- 保存歷史命令
- 選擇函數堆棧幀
- 給程序發送信號
- 設置條件斷點
- 打印尾調用堆棧幀信息
- 同時調試父進程和子進程
- 設置匯編指令格式
- 調試子進程
- 指定程序的輸入輸出設備
- 記錄執行gdb的過程
- 輸出信息多時不會暫停輸出
- 每行打印一個結構體成員
- 設置被調試程序的參數
- 設置命令提示符
- 設置命令提示符
- 設置讀觀察點
- 設置讀寫觀察點
- 只允許一個線程運行
- 按何種方式解析腳本文件
- 進入不帶調試信息的函數
- 設置臨時斷點
- 設置變量的值
- 設置觀察點只針對特定線程生效
- 設置觀察點
- 顯示gdb版權相關信息
- 不顯示線程啟動和退出信息
- 顯示gdb版本信息
- 啟動時不顯示提示信息
- 是否進入帶調試信息的函數
- 信號發生時是否暫停程序
- 替換查找源文件的目錄
- 讓catchpoint只觸發一次
- 進入和退出圖形化調試界面
- 向上或向下切換函數堆棧幀
- 使用“$_”和“$__”變量
- 使用“$_exitcode”變量
- 使用“$_siginfo”變量
- 使用“$_thread”變量
- 使用命令的縮寫形式