6-1 學習使用gdb
- 使用gdb命令進入gdb來調試
gdb ./helloworld #或者 gdb helloworld
- 操作過程
其中,p a表示打印a的值
表示十六進制
,d表示整型
,u表示無符號整型
,f表示浮點型
,s表示字符串
。b(byte)表示1個字節
,h(half-word)表示2個字節
,w(word)表示4個字節
,g(giant)表示8個字節
。
- 操作過程
6-2 段錯誤與內存轉儲
什麼情況下會發生段錯誤?
使用gdb命令來定位段錯誤
- 實際操作
- 實際操作
ulimit -c unlimited #shell的路徑在main.cpp路徑下
./helloworld
gdb helloworld core.*
bt #使用bt查看函數調用棧
gdb的補充說明
如何生成帶有調試信息的可執行文件?
如何判斷一個程序帶有調試信息?
- 實驗操作,帶有調試信息的helloworld
objdump -h helloworld
##生成下面的信息
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.gnu.build-id 00000024 0000000000400274 0000000000400274 00000274 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .gnu.hash 00000030 0000000000400298 0000000000400298 00000298 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynsym 00000150 00000000004002c8 00000000004002c8 000002c8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .dynstr 00000155 0000000000400418 0000000000400418 00000418 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version 0000001c 000000000040056e 000000000040056e 0000056e 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .gnu.version_r 00000050 0000000000400590 0000000000400590 00000590 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rela.dyn 00000030 00000000004005e0 00000000004005e0 000005e0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .rela.plt 000000c0 0000000000400610 0000000000400610 00000610 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .init 0000001a 00000000004006d0 00000000004006d0 000006d0 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .plt 00000090 00000000004006f0 00000000004006f0 000006f0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .plt.got 00000008 0000000000400780 0000000000400780 00000780 2**3
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .text 000002b2 0000000000400790 0000000000400790 00000790 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .fini 00000009 0000000000400a44 0000000000400a44 00000a44 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
15 .rodata 00000004 0000000000400a50 0000000000400a50 00000a50 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .eh_frame_hdr 0000005c 0000000000400a54 0000000000400a54 00000a54 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .eh_frame 00000194 0000000000400ab0 0000000000400ab0 00000ab0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
18 .init_array 00000018 0000000000600df0 0000000000600df0 00000df0 2**3
CONTENTS, ALLOC, LOAD, DATA
19 .fini_array 00000008 0000000000600e08 0000000000600e08 00000e08 2**3
CONTENTS, ALLOC, LOAD, DATA
20 .jcr 00000008 0000000000600e10 0000000000600e10 00000e10 2**3
CONTENTS, ALLOC, LOAD, DATA
21 .dynamic 000001e0 0000000000600e18 0000000000600e18 00000e18 2**3
CONTENTS, ALLOC, LOAD, DATA
22 .got 00000008 0000000000600ff8 0000000000600ff8 00000ff8 2**3
CONTENTS, ALLOC, LOAD, DATA
23 .got.plt 00000058 0000000000601000 0000000000601000 00001000 2**3
CONTENTS, ALLOC, LOAD, DATA
24 .data 00000010 0000000000601058 0000000000601058 00001058 2**3
CONTENTS, ALLOC, LOAD, DATA
25 .bss 00000118 0000000000601080 0000000000601080 00001068 2**5
ALLOC
26 .comment 0000002d 0000000000000000 0000000000000000 00001068 2**0
CONTENTS, READONLY
27 .debug_aranges 00000060 0000000000000000 0000000000000000 00001095 2**0
CONTENTS, READONLY, DEBUGGING
28 .debug_info 000029d4 0000000000000000 0000000000000000 000010f5 2**0
CONTENTS, READONLY, DEBUGGING
29 .debug_abbrev 00000765 0000000000000000 0000000000000000 00003ac9 2**0
CONTENTS, READONLY, DEBUGGING
30 .debug_line 000004ad 0000000000000000 0000000000000000 0000422e 2**0
CONTENTS, READONLY, DEBUGGING
31 .debug_str 00000d46 0000000000000000 0000000000000000 000046db 2**0
- 實驗操作,不帶調試信息的helloworld
objdump -h helloworld
## 生成以下信息
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.gnu.build-id 00000024 0000000000400274 0000000000400274 00000274 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .gnu.hash 00000030 0000000000400298 0000000000400298 00000298 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynsym 00000150 00000000004002c8 00000000004002c8 000002c8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .dynstr 00000155 0000000000400418 0000000000400418 00000418 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version 0000001c 000000000040056e 000000000040056e 0000056e 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .gnu.version_r 00000050 0000000000400590 0000000000400590 00000590 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rela.dyn 00000030 00000000004005e0 00000000004005e0 000005e0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .rela.plt 000000c0 0000000000400610 0000000000400610 00000610 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .init 0000001a 00000000004006d0 00000000004006d0 000006d0 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .plt 00000090 00000000004006f0 00000000004006f0 000006f0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .plt.got 00000008 0000000000400780 0000000000400780 00000780 2**3
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .text 000002b2 0000000000400790 0000000000400790 00000790 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .fini 00000009 0000000000400a44 0000000000400a44 00000a44 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
15 .rodata 00000004 0000000000400a50 0000000000400a50 00000a50 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .eh_frame_hdr 0000005c 0000000000400a54 0000000000400a54 00000a54 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .eh_frame 00000194 0000000000400ab0 0000000000400ab0 00000ab0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
18 .init_array 00000018 0000000000600df0 0000000000600df0 00000df0 2**3
CONTENTS, ALLOC, LOAD, DATA
19 .fini_array 00000008 0000000000600e08 0000000000600e08 00000e08 2**3
CONTENTS, ALLOC, LOAD, DATA
20 .jcr 00000008 0000000000600e10 0000000000600e10 00000e10 2**3
CONTENTS, ALLOC, LOAD, DATA
21 .dynamic 000001e0 0000000000600e18 0000000000600e18 00000e18 2**3
CONTENTS, ALLOC, LOAD, DATA
22 .got 00000008 0000000000600ff8 0000000000600ff8 00000ff8 2**3
CONTENTS, ALLOC, LOAD, DATA
23 .got.plt 00000058 0000000000601000 0000000000601000 00001000 2**3
CONTENTS, ALLOC, LOAD, DATA
24 .data 00000010 0000000000601058 0000000000601058 00001058 2**3
CONTENTS, ALLOC, LOAD, DATA
25 .bss 00000118 0000000000601080 0000000000601080 00001068 2**5
ALLOC
26 .comment 00000035 0000000000000000 0000000000000000 00001068 2**0
什麼時候使用gdb,是麼時候使用打印調試
gdb調試 -帶有命令行參數參考博客
今天在實現http客戶端編程的時候,需要使用命令行參數來輸入host的ip地址。但是程序運行的過程中一直報段錯誤。沒辦法,只能用gdb進行調試。那麼怎樣在調試的時候輸入我們需要的命令行參數呢。一般有兩種方法。
- 進入gdb調試:
gcc -g -Wall httpTest.c -o test #生成了可調試文件
gdb test 進入調試
-
下面可以使用兩種方法輸入命令行參數
- run 命令行參數
- set args 命令行參數
-
如:我的程序中需要輸入的時服務器端ip地址,可以通過以下兩種方法輸入
-
如果直接運行程序,run www.baidu.com
-
set args www.baidu.com,後面再繼續進行調試
-
-
實驗操作
這裏演示調試darknet
,我們使用gdb darknet
運行gdb,然後添加調試的命令行參數set args detect cfg/yolov2.cfg yolov2.weights data/dog.jpg
,最後run
運行整個程序。這裏由於運行gdb darknet時沒有加sudo,所以報錯:"darknet" received signal SIGBRT, Aborted.
,加上sudo
即可正常調試。