linux gdb除錯彙編

2021-08-30 20:56:29 字數 4308 閱讀 1204

1、除錯hello,要求編譯時指定了-gstabs選項

2、執行hello

deepfuture-lx@deepfuture-lx-desktop:~/private/mytest$ ./hello

hello,world

abcd

3、用gdb開啟hello

deepfuture-lx@deepfuture-lx-desktop:~/private/mytest$ gdb hello

gnu gdb (gdb) 7.1-ubuntu

license gplv3+: gnu gpl version 3 or later

this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law.  type "show copying"

and "show warranty" for details.

this gdb was configured as "x86_64-linux-gnu".

for bug reporting instructions, please see:

...reading symbols from /home/deepfuture-lx/private/mytest/hello...done.

4、列出源**

(gdb) list

warning: source file is more recent than executable.

1 .section .data#初始化的變數

2 output:

3   .ascii "hello,world\n"

4   #要列印的字串,.data為初始化值的變數。output是標籤,指示字串開始的位置,ascii為資料型別

5 .section .bss#未初始化的變數,由0填充的緩衝區

6   .lcomm num,20

7   #lcomm為本地記憶體區域,即本地彙編外的不能進行訪問。.comm是通用記憶體區域。

8 .section .text#組合語言指令碼

9   .globl _start#啟動入口

10   _start:

(gdb) list

11   movl $4,%eax#呼叫的系統功能,4為write   

12   movl $output,%ecx#要列印的字串

13   movl $1,%ebx#檔案描述符,螢幕為1   

14   movl $12,%edx#字串長度

15   int $0x80#顯示字串hello,world

16   

17   movl $0,%eax

18   movl $num,%edi

19   movl $65,1(%edi)#a 的ascii

20   movl $66,2(%edi)#b 的ascii 

5、設定斷點

(gdb) break 17

breakpoint 1 at 0x4000c6: file hello.s, line 17.

6、執行至斷點

(gdb) run

starting program: /home/deepfuture-lx/private/mytest/hello 

hello,world

breakpoint 1, _start () at hello.s:17

7、執行下條語句

17   movl $0,%eax

(gdb) next

18   movl $num,%edi

8、顯示所有暫存器的值

(gdb) info registers

rax            0x0 0

rbx            0x1 1

rcx            0x60011c 6291740

rdx            0xc 12

rsi            0x0 0

rdi            0x0 0

rbp            0x0 0x0

rsp            0x7fffffffe2d0 0x7fffffffe2d0

r8             0x0 0

r9             0x0 0

r10            0x0 0

r11            0x0 0

r12            0x0 0

r13            0x0 0

r14            0x0 0

r15            0x0 0

rip            0x4000cb 0x4000cb <_start+27>

eflags         0x202 [ if ]

cs             0x33 51

ss             0x2b 43

ds             0x0 0

es             0x0 0

fs             0x0 0

---type to continue, or q to quit---

gs             0x0 0

(gdb) next

19   movl $65,1(%edi)#a 的ascii

9、按十六進製制格式輸出edi暫存器的值。/x表示16進製制,/d表示10進製,/t表示二進位制

(gdb) print/x $rdi

$3 = 0x600128

10、顯示所有暫存器值

(gdb) info registers

rax            0x0 0

rbx            0x1 1

rcx            0x60011c 6291740

rdx            0xc 12

rsi            0x0 0

rdi            0x600128 6291752

rbp            0x0 0x0

rsp            0x7fffffffe2d0 0x7fffffffe2d0

r8             0x0 0

r9             0x0 0

r10            0x0 0

r11            0x0 0

r12            0x0 0

r13            0x0 0

r14            0x0 0

r15            0x0 0

rip            0x4000d0 0x4000d0 <_start+32>

eflags         0x202 [ if ]

cs             0x33 51

ss             0x2b 43

ds             0x0 0

es             0x0 0

fs             0x0 0

---type to continue, or q to quit--- 

gs             0x0 0

(gdb) next

20   movl $66,2(%edi)#b 的ascii 

11、顯示某個記憶體位置的值,x/nyz,其中n為字段數,y為格式(c為字元,d為10進製,x為16進製制),z為字段長度(b為位元組,n為16位字,w為32位字)

(gdb) next

21   movl $67,3(%edi)#c 的ascii 

(gdb) x/3cb &num

0x600128 : 0 '\000' 65 'a' 66 'b'

(gdb) next

22   movl $68,4(%edi)#d 的ascii

(gdb) next

23   movl $10,5(%edi)#\n的ascii 

(gdb) next

25   movl $4,%eax#呼叫的系統功能,4為write    

(gdb) x/4cb &num

0x600128 : 0 '\000' 65 'a' 66 'b' 67 'c'

12、退出gdb

(gdb)quit

深未來技術原創, 。附件為原始檔和目標檔案,解壓密碼為:deepfuture.iteye.com

Linux gdb除錯總結

進入除錯 1 輸入gdb 檔名 2 輸入gdb file 檔名 l 顯示源 預設顯示main函式所在檔案的源 list 檔名 num 顯示指定檔案指定行附近的源 b breakpoint的簡寫,設定斷點。b 行號 給指定行新增斷點 b 函式名 給指定函式新增斷點 b 檔名 行號 給指定檔案指定行新增...

Linux gdb除錯總結

在windows作業系統下,我們的執行程式有兩個版本。debug開發除錯版本 得到的可執行檔案.exe檔案相對較大,其中包含除錯資訊。且不做任何優化,未開發人員提供強大的應用除錯能力 release發行版本 檔案相對較小,不包含除錯資訊,並進行了各種優化,以期達到 最小和速度最優。為使用者的使用提供...

Linux gdb 除錯模式

linux gdb 除錯 編譯除錯版本的檔案 include g 啟動gdb除錯 若有main 有設定引數則可以在gdb下設定傳遞引數 set args gdb一些命令 1.run 執行整個程式 2.start 開始除錯 3.next n 逐條語句執行 4.step 逐條語句執行,並且嘗試進入函式內...