gdb除錯常用的指令

2021-09-02 19:38:42 字數 1881 閱讀 9102

關於第一次使用了gcc後,我做了一些總結:

以乙個題目為例:對於兩組使用者輸入的字串進行比較,長度自定,輸出相同的字元。

下面是一些gdb常用的指令:

首先是要進入gdb除錯環境,先通過gcc -g -o newname name.c 生成可執行檔案

gdb newname進入gdb除錯環境

退出gdb ,objdump -s name 進行反彙編

關於debug的一些心得:

然後開啟dosbox,先是mount c d:\

把d盤掛載到虛擬c盤:然後c:

接著輸入debug進入除錯環境

-a開始輸入組合語言

例子:-a100

0ae9:0100 mov dl,1

0ae9:0102 mov ah,2

0ae9:0104 int 21

0ae9:0106 int 20

0ae9:0108

然後執行-g執行,發現會宕機了,其實這個對於win10系統來說,是有問題的,可以改為g=100 106 執行,然後就列印出乙個笑臉。

每個彈出的位址,其實第乙個是段位址,第二個是偏移位址,段位址左移4位和偏移位址相加就是實際實體地址。上面這個語言其實是呼叫了dos裡面的指令,int的一些功能,呼叫int 21的指令功能,首先要給定一些入口引數:比如 ah 儲存的是第幾號指令,上面是2號,查表知是輸出某個字元,而字元的ascaii 值存在dl裡面,如上圖就是01.然後後面用int 21 呼叫指令執行輸出該字元,int 20 是結束標誌。

下面是一些指令的意思:

-g   執行

-r   檢視所有暫存器的值

-n name 對程式命名

-rbx -cx  -w 對程式寫操作,過程要對rbx rcx 的具體值進行修改,他們共同表示程式需要多少字                             節

dir  顯示所有目錄下的東西

d  start end 命令,可以顯示start end 之間儲存單元的值

e  偏移位址 修改的值,修改暫存器的值

我發現,ax儲存的第二位,就是儲存要輸出的值 

int 指令, 0a 的功能是輸入字串

dx 儲存的是字串的首位址,第乙個位元組是存字串的長度,第二位元組是字串的實際長度,第三個位元組        開始才是輸入的實際字串

所以用09 讀取字串時,應該是從第三單元開始讀取。詳見下面的彙編**

-a100

0ae9:0100 mov dx,0116

0ae9:0103 mov ah,0a

0ae9:0105 int 21

0ae9:0107 mov dl,0a

0ae9:0109 mov ah,02

0ae9:010b int 21

0ae9:010d mov dx,0118

0ae9:0110 mov ah,09

0ae9:0112 int 21

0ae9:0114 int 20

0ae9:0116 db 20

對於計算機的除法乘法,基本都是通過移位完成的,比如對於1 x10的操作

mov ax ,1

shl ax,1

mov bx, ax

shl ax,1

shl ax,1

add ax, bx

但是你可能會想,左移三位為什麼不一次性呢

其實不是不可以,只是要換一種方法

mov ax ,1

shl   ax,1

mov bx  ,ax

mov cl ,2;

shl  ax,cl

add ax,bx

就是大於1的時候,移動的位數要先儲存在cl裡面

謝謝,能看到這裡的你!

ubuntu 12 04 GDB除錯常用指令

編譯時必須加上引數 g 例 g g o hello hello.c 通過gcc編譯生成可執行檔案才能用gdb進行除錯。進入gdb介面 gdb hello 提示符變成 gdb 1 檢視檔案 原始碼 在gdb中鍵入 l list 就可以檢視所載入的檔案 2 設定斷點 只需在 b 後加入對應的行號即可 或...

手冊 GDB除錯指令

gdb l list 列出 line 5 行到 line 1 5 行間的內容 gdb l list 列出 line1 行到 line2 行間的內容 gdb r run argn 若 不列出引數 則使用 上次輸入引數 gdb show args 檢視當前使用 引數 gdb set args argn ...

gdb除錯相關指令

the gnu project debugger 1編譯2開啟gdb,設定相關斷點 r 或run 執行,前提是先要把斷點設定好 n 或next 下一步。c 或continue 執行至斷點,沒斷點就執行至結束 s 或step 進入函式體內部,不能進入就單步,可看見函式引數值,l 可看函式 b可增加斷點...