1. 程式人生 > >gdb除錯(四)函式呼叫棧之Backtraces

gdb除錯(四)函式呼叫棧之Backtraces


通過產看棧資訊,我們可以瞭解棧內幀的編號或地址,通過選擇幀我們可以移動到指定的幀內去產看資訊。

1、檢視棧資訊


產看函式呼叫棧的幾個函式

bt
    顯示所有的函式呼叫棧幀的資訊,每個幀一行。
bt n
    顯示棧定的n個幀資訊。
bt -n
    顯示棧底的n個幀資訊。

bt full
    顯示棧中所有幀的完全資訊如:函式引數,本地變數
bt full n
    用發同上。
bt full -n

例如:

(gdb) bt

#0 get_net_ipaddr (s=5, ifr=0xbfffe7ec, ipaddr=0xbfffe88c "192.168.1.200") at netif.c:67

#1 0x080491e2 in netinf_get (dev=0x8049a60 "eth0", ipaddr=0xbfffe88c "192.168.1.200", isup=0xbfffe844,

netmask=0xbfffe86c "\325I\024", hwaddr=0xbfffe84c "\001") at netif.c:296

#2 0x08048813 in main () at netif.c:34

(gdb) bt full

#0 get_net_ipaddr (s=5, ifr=0xbfffe7ec, ipaddr=0xbfffe88c "192.168.1.200") at netif.c:67

err = 0

#1 0x080491e2 in netinf_get (dev=0x8049a60 "eth0", ipaddr=0xbfffe88c "192.168.1.200", isup=0xbfffe844,

netmask=0xbfffe86c "\325I\024", hwaddr=0xbfffe84c "\001") at netif.c:296

s = 5

err = 0

ifr = {ifr_ifrn = {ifrn_name = "eth0", '\000' <repeats 11 times>}, ifr_ifru = {ifru_addr = {sa_family = 2,

sa_data = "\000\000\300\250\001\310\000\000\000\000\000\000\000"}, ifru_dstaddr = {sa_family = 2,

sa_data = "\000\000\300\250\001\310\000\000\000\000\000\000\000"}, ifru_broadaddr = {sa_family = 2,

ifru_newname = "\002\000\000\000\300\250\001\310\000\000\000\000\000\000\000",

ifru_data = 0x2 <Address 0x2 out of bounds>}}

#2 0x08048813 in main () at netif.c:34

err = 1

isup = 0

ipaddr = "192.168.1.200\000\004\b\270\350\377\277\245\324\025\000\060\340\021\000\273\231\004\b"

2、選擇幀


只有檢視所選擇幀內的資訊是合法的,如果要檢視指定幀內的資訊,首先要移動到指定幀。

frame n
f n
    通過幀編號來選擇幀,幀編號可以通過bt來檢視。

f addr
    通過幀地址來選擇幀,幀編號可以通過bt來檢視。

up n
    在棧中向上移動n個幀。即向著最外層移動n個幀。

down n
    與 up 反方向移動n個幀。

up-silently n
down-silently n
    在棧中移動n個幀,但是不列印資訊。

3、檢視幀內資訊

frame
f
    列印幀內函式的資訊。

info frame
info f
    列印幀的資訊。

例如:

(gdb) info frame

Stack level 1, frame at 0xbfffe820: //被選幀的地址

eip = 0x80491e2 in netinf_get (netif.c:296); saved eip 0x8048813

called by frame at 0xbfffe8c0, caller of frame at 0xbfffe7b0 //呼叫幀和被呼叫幀的地址

source language c.

Arglist at 0xbfffe818, args: dev=0x8049a60 "eth0", ipaddr=0xbfffe88c "192.168.1.200", isup=0xbfffe844,

netmask=0xbfffe86c "\325I\024", hwaddr=0xbfffe84c "\001" //變數地址

Locals at 0xbfffe818, Previous frame's sp is 0xbfffe820

Saved registers:

ebp at 0xbfffe818, eip at 0xbfffe81c //儲存的暫存器值地址

info frame addr
info f addr

列印通過addr指定幀的資訊。
例如: info f 0x08048813

info args
    列印函式變數的值。

info locals
    列印本地變數的資訊。

info catch


相關推薦

gdb除錯函式呼叫Backtraces

通過產看棧資訊,我們可以瞭解棧內幀的編號或地址,通過選擇幀我們可以移動到指定的幀內去產看資訊。 1、檢視棧資訊 產看函式呼叫棧的幾個函式 bt     顯示所有的函式呼叫棧幀的資訊,每個幀一行。 bt n     顯示棧定的n個幀資訊。 bt -n     顯示棧底

的分析————函式呼叫

當發生函式呼叫的時候,棧空間中存放的資料是這樣的: 1、呼叫者函式把被調函式所需要的引數按照與被調函式的形參順序相反的順序壓入棧中,即:從右向左依次把被調函式所需要的引數壓入棧; 2、呼叫者函式使用call指令呼叫被調函式,並把call指令的下一條指令的地址

gdb除錯1:單步執行和跟蹤函式呼叫

轉發自:http://songjinshan.com/akabook/zh/gdb.html#id1看下面的程式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18#include <stdio.h> in

進擊的JavaScript小白——函式

從初中開始,函式就已經出現了,好不容易畢業了,還被函式卡著脖子,這感覺真是。。。。 一、函式的作用 讓程式碼可以複用,提高程式碼的利用率 二、函式的宣告方式 1、函式的宣告語句 function fun () { //函式主題程式碼 } 2、函式的表示式 var

Python 學習筆記[函式進階]

異常 異常捕獲 try: myfile = open('1.txt') except Exception: print('開啟檔案錯誤') else: print('開啟檔案') myfile.close() finally: print('開啟檔案結束')

C語言函式函式的設計

1. 函式設計的時候,如果使用到全域性變數,就儘量通過引數的形式傳遞進來     也就是說,保持 函式 跟 外部的互動 只有 引數 和 返回值   2. 在有引數的情況下,或者有數值輸入的時候,要先進行錯誤判斷. int func( int *buf){   //1.錯誤判斷 i

[C++] 過載運算子與型別轉換2——函式呼叫運算子和型別轉換運算子

1、這兩個應該是C++中比較高階的用法了。 一、函式呼叫運算子   1、過載函式呼叫運算子(),必須是成員函式,一個類可以定義多個不同版本的呼叫運算子,相互之間應該在引數數量或者型別上有所區別。   2、定義了呼叫運算子的類的物件稱作 函式物件;函式

C++ 基礎C# 呼叫 C++的DLL: [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]

C# [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]   關於這部分內容,往後我會詳細解釋。   https://docs.microsoft.com/zh-cn/dotnet/api/syste

Python入門函式語法

Python 函式 函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。 函式能提高應用的模組性,和程式碼的重複利用率。你已經知道Python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式。 定義一個函式 你可以

VC6.0學習MFC呼叫Java

操作環境為win10,VC6.0,JDK1.8.0_191(x86)。 因為專案需要,在網上查看了很多相關文章,都沒能復現,反而是將多篇文章相結合才成功了,可以說過程相當熬人,弄了兩三天差點放棄。接下來說說整個呼叫過程。主要參考這篇文章《從 C/C++ 程式呼叫 Java 程式碼》,當然前面

騰訊開源手遊熱更新方案Xlua嚐鮮——Lua呼叫C#

new C#物件 你在C#這樣new一個物件: var newGameObj = new UnityEngine.GameObject(); 對應到Lua是這樣: local newGameObj =CS.UnityEngine.GameObject() 基本類似,除了:

gdb除錯3:觀察點和程式崩潰

$ gdb main ... (gdb) r Starting program: /home/akaedu/main 12345678 input=12345678 *** stack smashing detected ***: /home/akaedu/main terminated ======= Ba

Linux核心分析系統呼叫,使用者態及核心態

禹曉博+ 原創作品轉載請註明出處 + 歡迎加入《Linux核心分析》MOOC網易雲課堂學習 一、什麼是系統呼叫 我們知道由於種種原因(就是安全穩定性大部分)的考慮,作業系統是不能讓使用者直接進行一些有可能破換系統的行為,實際上還有另外一部分原因及時基於封裝性的考慮。作業系統

gdb除錯斷點設定英文板

Breakpoints are set with the break command (abbreviatedb). The debugger convenience variable `$bpnum' records thenumber of the breakpoint

COM元件開發——VC++呼叫COM元件的方法

ActiveX 控制元件          對於ActiveX控制元件,可以在Visual Studio中使用ClassWizard的方法引入,在MFC專案中選擇選單“專案”——> “新增類”——>“ActiveX控制元件中的MFC類”,然後可以分別從登錄檔和檔

Lua初學者--Lua呼叫原理展示lua的堆疊

這篇文章我是 攢了好久 沒寫了,看了這篇文章好,我覺得可以幫助大家更容易瞭解lua的執行原理,與呼叫方法,若有錯誤也希望及時指正。希望可以幫助到你。(2.3中的Gif圖,可以生動的表現過程) 一、L

簡析JavaScript中的Function型別——函式的內部屬性

開發十年,就只剩下這套架構體系了! >>>   

重學計算機組成原理- 函式呼叫怎麼突然Stack Overflow了!

用Google搜異常資訊,肯定都訪問過Stack Overflow網站 全球最大的程式設計師問答網站,名字來自於一個常見的報錯,就是棧溢位(stack overflow) 從函式呼叫開始,在計算機指令層面函式間的相互呼叫是怎麼實現的,以及什麼情況下會發生棧溢位 1 棧的意義 先看一個簡單的C程式 f

移動端事件—— 函式防抖和函式節流

函式防抖   在對於函式高頻次執行時,只執行一次。   有兩種情況:     1.尾部執行:高頻次觸發時,只執行最後一次     2.頭部執行:高頻次觸發時,只執行第一次   尾部執行實現很簡單,先設一個定時器,一開始觸發的時候我不執行,稍微延遲一會後再執行,當你下次執行時,我把上一次的定時器消失,

Golang原始碼學習:排程邏輯系統呼叫

## Linux系統呼叫 概念:系統呼叫為使用者態程序提供了硬體的抽象介面。並且是使用者空間訪問核心的唯一手段,除異常和陷入外,它們是核心唯一的合法入口。保證系統的安全和穩定。 呼叫號:在Linux中,每個系統呼叫被賦予一個獨一無二的系統呼叫號。當用戶空間的程序執行一個系統呼叫時,會使用呼叫號指明系統呼叫