1 調試一般分為兩種方法
可以通過在程序中插入打印語句。有點能夠顯示程序的動態過程,比較容易的檢查出源程序中的有關信息。缺點就是效率比較低了,而且需要輸入大量無關的數據。
2 借助相關的調試工具。
gdb
3 有哪些常用的調試工具呢?
3.1 strace
(1)我們知道在進行創建文件或者復制文件這些操作的時候,應用程序需要和操作系統進行一些交互。但是我們的程序一般不能直接訪問linux的內核。但是應用程序會跳轉到system_call的內核位置,內核然后檢查系統的調用號,然后這個號碼告訴內核需要什么服務。這就是所謂的"系統調用"
(2)認識starce
然后.g++ -o debug debug.cpp
strace ./debug就會出現如下圖內容(部分截圖,小伙伴可以通過試試查看更詳細的內容)
等號左邊為系統調用的函數名及其參數,右邊為返回值。通過上面部分的分析我們可以知道會自動調用很多函數用於進程初始化工作比如裝載被執行程序,載入libc函數庫,設置內存映射等。
(3) 統計系統調用
通過加上-c的做統計分析。比如strace -c ./debug.另外-o將結果輸出到文件。-T將每個系統調用所花費的時間打印出來。-t.-tt等可以記錄每次系統調用發生的時間。
3.2 gdb
(1)認識gdb
a:啟動程序可以按照用戶自定義的要求隨心所欲的運行程序
b:可以被調試的程序在指定的斷點挺住
c:當程序停住時候可以檢查程序的運行狀態
d:動態的改變程序的執行環境
(2)gdb常用方法
a:程序如下

1 #include<iostream> 2 using namespace std; 3 4 int func(int n) 5 { 6 int result = 0; 7 for(int i=1;i<=n;i++) 8 { 9 result+=i; 10 } 11 return result; 12 } 13 14 int main() 15 { 16 int arr[10]; 17 arr[0] = 0; 18 arr[1] = 1; 19 for(int i=2;i<10;i++) 20 { 21 arr[i]=arr[i-1]+arr[i-2]; 22 23 } 24 cout<<"arr[9]"<<arr[9]<<endl; 25 cout<<"func(9)"<<func(9)<<endl; 26 return 0; 27 }
b:gdb gdb進入gdb環境 l---->從第一行列出源碼 按enter重復上一次命令,b 15----->表示在15行設置斷點。info break----->查看斷點。r----->運行程序.n----->表示next單步運行。p i--->打印變量。bt------>查看函數堆棧。q--->結束調試
(3)gdb分析core文件
a:core文件的存儲路徑。通常是在執行程序的時候會出現段錯誤。但是在當前的目錄下面沒有coredump文件。可以通過如下命令查看core文件的存在位置
cat /proc/sys/kernel/core_pattern
更改coredump文件的存儲位置
echo "/data/coredump/core">/proc/sys/kernel/core_pattern
設置core文件的名字讓我們清楚知道是哪一個程序的core錯誤
echo "/data/coredump/core.%e.%p">/proc/sys/kernel/core_pattern這樣的core會自導崩潰的程序嗎和進程ID
b:產生core的條件
有的時候需要確認當前的繪畫能夠生成coredump文件的大小。大小為0則不會生成對應的coredump文件。
通過ulimit -c可以查看coredump文件大小的最大值
通過ulimit -c unlimited設置core文件不受限制。如果需要指定大小則ulimit -c size但是只是對當前的會話有作用
(4)gdb定位coredump文件 非法訪問內存

#include <stdio.h> int main() { int b = 1; int *a; *a = b; return 0; }
查看coredump文件的ELF頭部
readelf -h core..... 發現文件格式為CORE說明是core-dump文件
執行gdb test core*可以發現程序第5行*a=b 然后分別打印a和b的值 返現指向的地址為非法區域。也就是沒有分配內存導致。
3.3 top
(1)相關參數說明
第一行:系統當前時間 系統運行時間 當前用戶登陸數和系統的負載。其中負載分別為1min 5min 15min
第二行:total(進程總數) ruunig(正在運行的進程數) sleeping(睡眠的進程數) zombie(僵屍進程數)
第三行:%us(用戶空間占用cpu比例) %id(空閑cpu百分比,通過這個可以反應一個系統的cou閑忙成都) %wa(等待輸入輸出io) %hi(cpu處理硬件終端時間)
第四行顯示內存MEM數據:
buffers和cache區別:buffers是塊設備的讀寫緩沖區,cache是文件系統本身的頁面緩存。目的都是為了加速磁盤的訪問。
3.4 ps
(1)常用命令1
ps -u 用戶名 查看指定用戶的信息
(2)顯示某個進程信息
ps -ef| grep 進程名
(3)列出目前所有正在內存當中的程序
ps aux
好叻 今天就到這里了,加油!!!!