課程
/后端開發
/C
/Linux C語言指針與內存
gdb調試不懂啊,能在講一下嘛
2016-04-11
源自:Linux C語言指針與內存 4-1
正在回答
一段程序執行太快了,若想知道該程序在執行過程的每一步執行后對結果的影響或者了解該語句的作用,則需要一種調試工具,讓他動作變慢,并且隨著你的控制讓他一步一步的執行,而且其間你可以用一些命令查看內存,驗證結果,這就是gdb調試工具的作用。以下是我的筆記:
GDB可以對程序進行斷點調試,單步調試,
如果用gdb調試,需要對程序重新編譯,格式為:
gcc –g main.c –o main.out
這樣生成的main.out才能用gdb調試。
需要注意的是,在調試的時候不能刪除原代碼文件,即main.c ,如果將main.c刪除了,gdb依然不支持斷點、單步調試。
用gdb調試程序格式:gdb ./main.out? 或gdb main.out
list 或者 l? 列出當前調試程序的部分(前10行)源代碼。
再按一次回車(默認執行上一次命令),繼續列出下面的源代碼
單步調試命令:start
執行后顯示:默認斷點1在main()處,具體行數為本文件的第13行
第13行的指令為:int a=5;
查看內存中變量的值,print a??? 簡寫 p a 回車
顯示a的值
因為int a=5;指令還沒有執行完畢,所以a為編譯器給的默認值。
n 回車? 下一條指令? n----next
s 回車? 執行一行源代碼并進入函數內部??? s----step
當前被調用函數將實參賦于形參,并定位到第5行
bt 回車? 查看函數堆棧
編號0?? change 函數?? 定位到第6行
編號1?? main函數??? 定位到第15行
編號0在最上層,所以當前在change 函數中
f 編號?? 可以定位到哪一層函數f(frame)切換調用的上下文,進入相應的棧里,使用該命令可以打印棧層編號,當前的函數名,函數參數值,函數所在的文件及行號,函數執行到的語句等等;
? 例:f 1
?
進入到編號1的函數中,即main函數? 并定位到15行的那條語句
q?? 退出調試
3-2使用gdb調試案例
&取地址符
0x 十六進制符號
a=0xbffff064? 給形參a賦的值是0xbffff064的內存地址
b=0xbffff068? 給形參b賦的值是0xbffff068的內存地址
int temp=*a;//將內存地址a中的存儲的數據賦值給整型變量temp,即temp=5.
int temp =a;//將內存地址a賦值給整型變量temp,即temp=0x bffff064
跟著老師的視頻做,一步一步的,就會理解該工具命令的含義了。
你可以把這段視頻多看幾遍
舉報
指針-C語言的核心,代領大家對c語言有更加深刻的理解
3 回答有關gdb調試問題
1 回答gdb 不能調試
4 回答有關GDB調試進程內容問題
2 回答VC里面有什么像gdb一樣的調試工具啊啊
2 回答gdb地址表示的問題(應該是)
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-07-12
一段程序執行太快了,若想知道該程序在執行過程的每一步執行后對結果的影響或者了解該語句的作用,則需要一種調試工具,讓他動作變慢,并且隨著你的控制讓他一步一步的執行,而且其間你可以用一些命令查看內存,驗證結果,這就是gdb調試工具的作用。以下是我的筆記:
GDB可以對程序進行斷點調試,單步調試,
如果用gdb調試,需要對程序重新編譯,格式為:
gcc –g main.c –o main.out
這樣生成的main.out才能用gdb調試。
需要注意的是,在調試的時候不能刪除原代碼文件,即main.c ,如果將main.c刪除了,gdb依然不支持斷點、單步調試。
用gdb調試程序格式:gdb ./main.out? 或gdb main.out
list 或者 l? 列出當前調試程序的部分(前10行)源代碼。
再按一次回車(默認執行上一次命令),繼續列出下面的源代碼
單步調試命令:start
執行后顯示:默認斷點1在main()處,具體行數為本文件的第13行
第13行的指令為:int a=5;
查看內存中變量的值,print a??? 簡寫 p a 回車
顯示a的值
因為int a=5;指令還沒有執行完畢,所以a為編譯器給的默認值。
n 回車? 下一條指令? n----next
s 回車? 執行一行源代碼并進入函數內部??? s----step
當前被調用函數將實參賦于形參,并定位到第5行
bt 回車? 查看函數堆棧
編號0?? change 函數?? 定位到第6行
編號1?? main函數??? 定位到第15行
編號0在最上層,所以當前在change 函數中
f 編號?? 可以定位到哪一層函數f(frame)切換調用的上下文,進入相應的棧里,使用該命令可以打印棧層編號,當前的函數名,函數參數值,函數所在的文件及行號,函數執行到的語句等等;
? 例:f 1
?
進入到編號1的函數中,即main函數? 并定位到15行的那條語句
q?? 退出調試
3-2使用gdb調試案例
&取地址符
0x 十六進制符號
a=0xbffff064? 給形參a賦的值是0xbffff064的內存地址
b=0xbffff068? 給形參b賦的值是0xbffff068的內存地址
int temp=*a;//將內存地址a中的存儲的數據賦值給整型變量temp,即temp=5.
int temp =a;//將內存地址a賦值給整型變量temp,即temp=0x bffff064
跟著老師的視頻做,一步一步的,就會理解該工具命令的含義了。
2016-04-13
你可以把這段視頻多看幾遍