linux gdb快速入門教程

      網友投稿 837 2022-05-30

      文章目錄

      前言

      常用指令概覽

      開始使用gdb

      一個完整流程一般所需步驟

      1 加載程序

      2 查看

      2.1 查看函數

      3 設置斷點

      3.1 根據函數名設置斷點

      3.2 根據程序位置(第幾行)

      4 運行程序

      5 查看變量

      6 查看寄存器

      總結

      參考

      前言

      gdb是一個由GNU開源組織發布的、UNIX/LINUX操作系統下的、基于命令行的、功能強大的程序調試工具。對于想要學習gdb調試的童鞋,網上搜一下就是一大堆資料,信息太多而不知道該如何篩選了,當然最有效的方式是去看gdb的手冊,但是對于想快速上手的我,需要掌握最常用的一些指令和一些技巧,期間,我找到了一本很強大的書,感覺就是gdb bible——100-gdb-tips,100-gdb-tips-gitbook;強烈推薦參考這個文檔。文檔里已經基本涵蓋了gdb使用的各種操作和技巧,但是都相互比較獨立和分散,沒有一個完整的使用流程,下面我會總結一下整體使用的一個流程。

      常用指令概覽

      開始使用gdb

      通常我們編寫一個程序,具體程序如下所示;并且編譯成帶調試信息的可執行文件,然后在用gdb加載調試;

      /* * demo learning gdb * gdb-sample.c */ #include void func_a(int *p){ printf("%s:p is %d | valuse is %d \n",__func__,p,*p); } void func_b(int *p){ *p = 12345; func_a(p); } void func_c(int *p){ p = NULL; func_b(p); } int main(void) { int i = 0,j=0; int *p = &j; for(; i<6; i++){ if(i<2){ func_a(p); }else if(i<4){ func_b(p); }else{ func_c(p); } } return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      gcc -g gdb-sample.c -o gdb-sample

      1

      記得帶上-g選項,最后編譯成功并生成可執行文件gdb-sample;

      一個完整流程一般所需步驟

      gdb -q gdb-sample

      1

      使用i functions或者info functions可以查看當前的可執行文件的函數接口;

      (gdb) i functions All defined functions: File gdb-sample.c: void func_a(int *); void func_b(int *); void func_c(int *); int main(void); Non-debugging symbols: 0x0000000000400460 _init 0x0000000000400490 puts@plt 0x00000000004004a0 __stack_chk_fail@plt 0x00000000004004b0 printf@plt 0x00000000004004c0 __libc_start_main@plt 0x00000000004004e0 _start 0x0000000000400510 deregister_tm_clones 0x0000000000400550 register_tm_clones 0x0000000000400590 __do_global_dtors_aux 0x00000000004005b0 frame_dummy 0x00000000004006f0 __libc_csu_init 0x0000000000400760 __libc_csu_fini 0x0000000000400764 _fini

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      斷點使用

      (gdb) b main Breakpoint 1 at 0x400658: file gdb-sample.c, line 19.

      1

      2

      (gdb) l 1 #include 2 3 void func_a(int *p){ 4 printf("%s:p is %d | valuse is %d \n",__func__,p,*p); 5 } 6 7 void func_b(int *p){ 8 *p = 12345; 9 func_a(p); 10 } (gdb) 11 12 void func_c(int *p){ 13 p = NULL; 14 func_b(p); 15 } 16 17 18 19 int main(void) { 20 int i = 0,j=0; (gdb) 21 int *p = &j; 22 for(; i<6; i++){ 23 if(i<2){ 24 func_a(p); 25 }else if(i<4){ 26 func_b(p); 27 }else{ 28 func_c(p); 29 } 30 } (gdb) b 19 Breakpoint 3 at 0x400618: file gdb-sample.c, line 19.

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      linux gdb快速入門教程

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      刪除斷點

      (gdb) d 刪除所有斷點嗎? (y or n) y

      1

      2

      使用run或r運行程序,如果被斷點中斷,可以使用c繼續運行程序;

      (gdb) r Starting program: /home/thinkpad/code/gdb-tips/core_dump/gdb-sample Breakpoint 1, main () at gdb-sample.c:19 19 int main(void) {

      1

      2

      3

      4

      5

      使用next或者n可以進行單步調試;不會進入到子函數內部;

      使用step或者s可以進行單步調試;會進入到子函數內部;

      查看變量可以使用print和p

      (gdb) b main Breakpoint 6 at 0x400618: file gdb-sample.c, line 19. (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/zhaojh/code/gdb-tips/core_dump/gdb-sample Breakpoint 6, main () at gdb-sample.c:19 19 int main(void) { (gdb) n 20 int i = 0,j=0; (gdb) p i $1 = 0 (gdb) n 21 int *p = &j; (gdb) n 22 for(; i<6; i++){ (gdb) p p $2 = (int *) 0x7fffffffe2f8 (gdb) p *p $3 = 0 (gdb)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      使用i r,info register,i register,info r可以查看寄存器;

      (gdb) i r rax 0x7fffffffe2f8 140737488347896 rbx 0x0 0 rcx 0x0 0 rdx 0x7fffffffe408 140737488348168 rsi 0x7fffffffe3f8 140737488348152 rdi 0x1 1 rbp 0x7fffffffe310 0x7fffffffe310 rsp 0x7fffffffe2f0 0x7fffffffe2f0 r8 0x400710 4196112 r9 0x7ffff7de7ac0 140737351940800 r10 0x846 2118 r11 0x7ffff7a2d740 140737348032320 r12 0x4004a0 4195488 r13 0x7fffffffe3f0 140737488348144 r14 0x0 0 r15 0x0 0 rip 0x40063f 0x40063f eflags 0x293 [ CF AF SF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      總結

      記錄了一些比較簡單并且會被普遍用到的gdb指令,作為入門使用還是比較好的,更多高級的調試參考gdb bible——100-gdb-tips,100-gdb-tips-gitbook。

      參考

      https://github.com/hellogcc/100-gdb-tips

      https://wizardforcel.gitbooks.io/100-gdb-tips/content/

      GDB十分鐘教程

      Linux 單片機 匯編語言

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎樣才能畫出清晰明了的時序圖
      下一篇:2020年人工神經網絡第二次作業
      相關文章
      国产亚洲精品美女久久久 | 亚洲午夜免费视频| 国产亚洲美女精品久久久2020| 久久久久亚洲AV无码去区首| 亚洲精品一卡2卡3卡四卡乱码| 亚洲一区二区观看播放| 亚洲中文字幕久久精品无码A| 亚洲午夜精品一区二区公牛电影院 | 中文字幕专区在线亚洲| 美腿丝袜亚洲综合| 国产午夜亚洲精品午夜鲁丝片 | 亚洲伊人色一综合网| 亚洲国语在线视频手机在线| 亚洲电影在线播放| 亚洲激情黄色小说| 亚洲va成无码人在线观看| 激情五月亚洲色图| 亚洲熟妇无码一区二区三区导航| 亚洲一级黄色大片| 亚洲熟女乱色一区二区三区| 亚洲av永久无码| 亚洲高清无码综合性爱视频| 国产精品亚洲αv天堂无码 | 亚洲中文无码亚洲人成影院| 亚洲欧美自偷自拍另类视| 亚洲国产精品嫩草影院| 亚洲福利在线播放| 国产国拍精品亚洲AV片| 久久精品国产精品亚洲精品| 亚洲第一视频网站| 亚洲婷婷天堂在线综合| 中文字幕精品三区无码亚洲| 亚洲av乱码中文一区二区三区| 国产精品亚洲综合| 亚洲综合日韩久久成人AV| 久久久亚洲精品视频| 亚洲影视一区二区| 亚洲爆乳少妇无码激情| 亚洲免费一区二区| 久久精品国产亚洲av四虎| 亚洲特级aaaaaa毛片|