6 Linu下gdp調試技術

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地址,可以通過以下兩種方法輸入

  • 實驗操作

    • 這裏演示調試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即可正常調試。
      在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章