編譯器 GCC
IDE vscode pycharm
調(diào)試器 GDB (GCC的模型編譯器)
GDB官網(wǎng)
一個(gè)中文教程
gdb 命令
在終端中使用 man gdb
可以看到gdb有那些命令
list 列出 讀取的代碼 每次list的顯示的有限愿卒,可以繼續(xù)list
run 運(yùn)行程序 簡(jiǎn)寫(xiě)為r
next 一步一步調(diào)試 簡(jiǎn)寫(xiě)為n
quit 退出gdb模式
break 打斷點(diǎn) 簡(jiǎn)寫(xiě)為b
通過(guò)前面加shell 可以使用本身終端的功能
shell ls 可以查看當(dāng)前路徑下有那些文件
shell cat 具體文件名缚去,可以像在終端用 cat命令查看文件一樣
info b #看在哪里打了斷點(diǎn) (查看斷點(diǎn)的情況)
gdb 打了斷點(diǎn)后如何去看變量的信息
print 簡(jiǎn)稱(chēng) p
也可以打印地址
p &arr[0]
step 步入
step步入 簡(jiǎn)寫(xiě)為s
設(shè)置日志模式
set logging on #舊
set logging enabled on #新
可以記錄你進(jìn)行了那些gdb調(diào)試
只會(huì)記錄你開(kāi)啟之后的,敲這個(gè)命令前的操作是不會(huì)有記錄的琼开。
并且其針對(duì)的是這次調(diào)試易结,下次調(diào)試需要你再次使用這個(gè)命令。
并且下次開(kāi)啟是繼續(xù)在gdb.txt中記錄柜候,不會(huì)刪除以前的記錄
watchpoint
wathchpoint和breakpoint是同一級(jí)別的
可以用來(lái)觀察一個(gè)值有沒(méi)有變
監(jiān)控一個(gè)地址下的值
watch *地址
info wathpoint 或 info watchpoints
但我實(shí)操?zèng)]記錄
(gdb) set logging enabled on
Copying output to gdb.txt.
Copying debug output to gdb.txt.
(gdb) list
1 #include <main.h>
2 #include <hello.h>
3
4 using namespace std;
5 int main(){
6 // cout<<"hello"<<endl;
7
8 int arr[4]={1,2,3,4};
9 int i=0;
10 for (i=0;i<4;i++){
(gdb) b 9
Breakpoint 1 at 0x1200: file /home/aaa/workspace/Git_learn/Git_Attempt_001/src/ main.cpp, line 9.
(gdb) r
Starting program: /home/aaa/workspace/Git_learn/Git_Attempt_001/output/Git_Attempt_001
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main () at /home/aaa/workspace/Git_learn/Git_Attempt_001/src/ main.cpp:9
9 int i=0;
(gdb) p &i
$1 = (int *) 0x7fffffffd94c
(gdb) watch *0x7fffffffd94c
Hardware watchpoint 2: *0x7fffffffd94c
(gdb) info watchpoints
Num Type Disp Enb Address What
2 hw watchpoint keep y *0x7fffffffd94c
(gdb) n
10 for (i=0;i<4;i++){
(gdb) n
11 printf("輸出 %d\n",arr[i]);
(gdb) n
輸出 1
10 for (i=0;i<4;i++){
(gdb) n
11 printf("輸出 %d\n",arr[i]);
(gdb) n
輸出 2
10 for (i=0;i<4;i++){
(gdb)
去看i的值 也沒(méi)有提示變化搞动,母雞啊
(gdb) watch i
Hardware watchpoint 2: i
(gdb) info watchpoints
Num Type Disp Enb Address What
2 hw watchpoint keep y i
(gdb) n
10 for (i=0;i<4;i++){
(gdb) n
11 printf("輸出 %d\n",arr[i]);
(gdb) n
輸出 1
10 for (i=0;i<4;i++){
(gdb) n
11 printf("輸出 %d\n",arr[i]);
(gdb) n
輸出 2
10 for (i=0;i<4;i++){
(gdb)
調(diào)試一個(gè)core文件
Core 文件是系統(tǒng)在程序崩潰時(shí)生成的內(nèi)存轉(zhuǎn)儲(chǔ)文件。它捕獲了程序在崩潰時(shí)的內(nèi)存狀態(tài)渣刷,包括寄存器內(nèi)容鹦肿、堆棧內(nèi)容、活動(dòng)內(nèi)存區(qū)域和其它相關(guān)的調(diào)試信息辅柴。這些文件通常用于調(diào)試狮惜,幫助開(kāi)發(fā)者確定程序崩潰的原因和所在的位置。
這個(gè)調(diào)試錯(cuò)誤文件在linux中不是默認(rèn)有的碌识,要進(jìn)行設(shè)置
在終端中ulimit -a
可以看到 core file size哪一項(xiàng)為0
-a 顯示目前資源限制的設(shè)定碾篡。
-c <core文件上限> 設(shè)定core文件的最大值,單位為區(qū)塊筏餐。
-d <數(shù)據(jù)節(jié)區(qū)大小> 程序數(shù)據(jù)節(jié)區(qū)的最大值开泽,單位為KB。
-f <文件大小> shell所能建立的最大文件魁瞪,單位為區(qū)塊穆律。
-H 設(shè)定資源的硬性限制惠呼,也就是管理員所設(shè)下的限制。
-m <內(nèi)存大小> 指定可使用內(nèi)存的上限峦耘,單位為KB剔蹋。
-n <文件數(shù)目> 指定同一時(shí)間最多可開(kāi)啟的文件數(shù)。
-p <緩沖區(qū)大小> 指定管道緩沖區(qū)的大小辅髓,單位512字節(jié)泣崩。
-s <堆疊大小> 指定堆疊的上限,單位為KB洛口。
-S 設(shè)定資源的彈性限制矫付。
-t <CPU時(shí)間> 指定CPU使用時(shí)間的上限,單位為秒第焰。
-u <程序數(shù)目> 用戶最多可開(kāi)啟的程序數(shù)目买优。
-v <虛擬內(nèi)存大小> 指定可使用的虛擬內(nèi)存上限,單位為KB挺举。
設(shè)置成生成錯(cuò)誤報(bào)告文件
ulimit -c unlimited
然后我這個(gè)Ubuntu 是apport在管理
gdb 正在運(yùn)行的程序
后臺(tái)執(zhí)行
./output/Git_Attempt_001 &
會(huì)返回一個(gè) pid 進(jìn)程號(hào)
也可以
ps -ef | grep Git_Attempt_001
然后
gdb -p pid