想一想,自己寫的程式不會調,那也太難受了吧
自己在Windows程式設計的時候,介面化的調式都搞不定,還能做命令列的調式?相信我。Linuxgdb除錯比你想象的要好玩得多!!!!
在Linux中,gdb的除錯功能十分強大。在這裡可以安裝一個小外掛:wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh
#include<stdio.h> #include<stdlib.h> int add_num(int a,int b) { printf("this is a test!"); return a+b; } int main(int args,char*argv[]) { int a=12,b=13; pid_t pid; pid = fork(); if(pid<0) { perror("fork"); exit(1); } if(pid==0) { int c=add_num(a,b); print("%d+%d=%d",a,b,c); exit(1); } int c = b-a; int *d = &c; print("%d-%d=%d",b,a,*d); return 0; }
這裡fork()是建立子程式。插入一下:子程式和父程式擁有同樣的程式碼段。也就是會有兩個程式來執行同一段程式碼。不過,子程式程式號pid在這個程式中是為0的。而父程式的pid是大於0的。這樣就可以區分了。pid==0是執行子程式,子程式在呼叫一個函式就退出了。而父程式會執行最後幾行程式碼。
通過gdb ./gdb_test 啟動gdb
1. b 是打上斷點 b 程式碼行數 或者 b 函式名 檢視斷點資訊:info breakpoints 取消斷點:delete 斷點號
1 l是檢視程式碼 用法與b一樣
3. 執行程式:r 執行下一行:n
4. 檢視變數的值:p /d 是十進位制
5. 多程式多執行緒除錯 :由於子程式和父程式執行不同的程式碼。先選擇跟著子程式執行 :set follow-fork-mode child 檢視有幾個程式:info inferiors 可以通過attach 程式號跟程式
6. 進入函式:s 快速完成函式:finish
7. 檢視棧空間:bt
8.檢視堆:heap
9. 檢視地址 :x /20 是檢視20個
一點點gdb基礎,希望有所幫助。。