gdb学习(二)[第二版]
查看運行時數據
print?-?查看變量值
?
ptype?–?查看變量類型
#ptype?i
#ptype?“aaa” 打印字符串”aaa”的類型
#ptype?array 打印數組array的類型
#ptype?main 打印main函數的類型
?
print?array?–?查看數組
#p?arr1
#p?arr1[2] 查看數組arr2第三個元素值
#p?&arr1[2] 打印數組元素的地址
#p?&arr1 打印數組首地址,與p?&arr1[0]作用類似
?
print?*array@len?–?查看動態內存
#p?*arr2@10?
#p?*arr2@15? #將數組越界之后的內存也打印出來了
#p?*arr@10 #靜態的數組也可以改方式打印
#p?arr[2]@2 #從arr[2]開始的兩個元素
#p?arr@2 #打印兩個數組
?
print?x=5?–?動態改變運行時數據
#print?i?=?1000
?
程序錯誤
編譯錯誤:編寫程序的時候沒有符合語言規范導致編譯錯誤【語法錯誤】。
運行時錯誤:編譯器檢查不出這種錯誤,但在運行的時候可能會導致程序崩潰【如:內存地址非法訪問】。
邏輯錯誤:編譯和運行都很順利,但是執行結果不對
?
gdb調試邏輯錯誤
//示例-實現逆序輸出字符串hello,但是卻沒有任何輸出 #include <stdio.h> int main(void) {int i; char str[6] = "hello";char reverse_str[6] = "";printf("%s\n", str);for (i=0; i<5; i++)reverse_str[5-i] = str[i]; //Error:應該是reverse_str[4-i]...printf("%s\n", reverse_str);return 0; }gdb調試段錯誤
段錯誤是由于訪問非法地址而產生的錯誤。
1、訪問系統數據區,尤其是往系統保護的內存地址寫數據。最常見就是給一個0地址指針賦值?
2、內存越界(數組越界,變量類型不一致等)?訪問到不屬于你的內存區域
//示例 #include <stdio.h> #include <stdlib.h> void segfault1() { int *p = NULL; *p = 100; } void segfault2() { char buf[1] = "a"; buf[13] = 'A'; printf("%c\n",buf[13]); } void segfault3() { char buf[1] = "a"; buf[10] = 'A'; printf("%c\n",buf[10]); } int main() { segfault1(); // segfault2(); // segfault3(); return 0; }where命令?or?bt命令:棧回溯,顯示導致段錯誤的執行函數樹
?
wh命令查看程序代碼窗口
?
?
core文件調試
1、core文件
在程序崩潰時,一般會生成一個文件叫core文件。core文件記錄的是程序崩潰時的內存映像,并加入調試信息。core文件生成的過程叫做core?dump
?
2、設置生成core文件
ulimit?-c?? #查看core-dump狀態
ulimit?-c?數字?(如:ulimit?-c?1024)
ulimit?-a #用于查看當前所有狀態信息
?
將ulimit?-c?unlimited寫入~/.bashrc,則默認會生成core文件
?
3、gdb利用core文件調試
gdb?程序名?[core-file] #如:gdb?bugging?core
總結
以上是生活随笔為你收集整理的gdb学习(二)[第二版]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言的优先级注意
- 下一篇: silverlight storyboa