gdb 呼叫棧 (call stack)
分享一篇不錯的文章講述呼叫棧; 如果得到呼叫棧
不做全文翻譯,做個簡單歸納:
有三種方式得到呼叫棧:
a. 通過棧楨暫存器(frame pointer register). 每一層函式呼叫都儲存前一層棧楨, 這樣順著棧楨就能得到整個呼叫棧;
x86機器上上就是ebp作為棧楨. 典型的x86函式返彙編出來的程式碼:
push %ebp // 儲存前一個棧楨
mov %esp,%ebp // 切換到當前棧楨
( 真正函式內容)
leave // set esp = ebp, 然後pop ebp; 就是恢復上一個棧楨;
ret
b. DWARF 段
棧楨暫存器畢竟消耗了一個暫存器. 釋放棧楨暫存器, 就能夠讓程式碼多一個通用暫存器用;
gcc 預設使用ebp作為棧楨; 有一個選項可以釋放ebp: -fomit-frame-pointer
加上這個編譯選項之後,ebp 不再作為棧楨,相應程式效能一般有所提高,但是給調式帶來麻煩.
gcc還是有辦法的,在編譯時候把每個ip地址對應的呼叫棧資訊(比如那個暫存器或者記憶體儲存著上一個呼叫棧),儲存在elf檔案中; 專門有個標準DWARF,定義呼叫棧資訊的格式;
在gcc 編譯的時候,有一個選項 -fasynchronous-unwind-tables, 加上這個選項之後,即使沒有棧楨暫存器,gdb也能順利地得到呼叫棧;(信不信由你,試過就知道了)
c. 自己解析程式碼
有時候你拿到別人的程式碼需要調式,程式碼在編譯的時候加上了-fomit-frame-pointer,又沒有-fasynchronous-unwind-tables,這時候你可以自己寫程式碼解析呼叫棧;
基本演算法是說:通過語義解析程式程式碼,你可以讀取當前堆疊內容,知道當前esp值,返回值,上一層呼叫的esp值;這個做法的效果怎麼樣沒有試過.
相關推薦
gdb 呼叫棧 (call stack)
分享一篇不錯的文章講述呼叫棧; 如果得到呼叫棧 不做全文翻譯,做個簡單歸納: 有三種方式得到呼叫棧: a. 通過棧楨暫存器(frame pointer register). 每一層函式呼叫都儲存前一層棧楨, 這樣順著棧楨就能得到整個呼叫棧; x86機器上上
一起talk GDB吧(第四回:GDB呼叫棧除錯)
各位看官們,大家好,上一回中我們說的是GDB的斷點除錯功能,並且說了如何使用GDB進行斷點除錯。 這一回中,我們繼續介紹GDB的除錯功能:呼叫棧除錯。當然了,我們也會介紹如何使用GDB進行呼叫棧 除
【軟體開發底層知識修煉】十七 快速學習GDB除錯四 使用GDB進行函式呼叫棧的檢視
上一篇文章學習瞭如何使用GDB資料斷點進行記憶體監測:【軟體開發底層知識修煉】十五 快速學習GDB除錯三 使用GDB的資料斷點監測變數是否改變 本篇文章繼續上一篇文章的學習:如何使用GDB進行函式呼叫棧的檢視 文章目錄
gdb除錯(四)函式呼叫棧之Backtraces
通過產看棧資訊,我們可以瞭解棧內幀的編號或地址,通過選擇幀我們可以移動到指定的幀內去產看資訊。 1、檢視棧資訊 產看函式呼叫棧的幾個函式 bt 顯示所有的函式呼叫棧幀的資訊,每個幀一行。 bt n 顯示棧定的n個幀資訊。 bt -n 顯示棧底
gdb檢視函式呼叫棧
(1)楨號:呼叫棧中對楨的一個編號,從0開始,依次增大(2)PC:Program counter暫存器,指向當前楨中下一條要執行的指令的地址(3)函式名:當前楨中被呼叫的函式的名字(4)引數及傳入的值:當前楨中被呼叫的函式在呼叫時傳入的引數及其值(5)原始碼位置:當前楨執行到的原始碼位置,格式為 file:
Call Stack技巧(呼叫堆疊除錯)
1、堆疊除錯的原理 呼叫堆疊反映了當前斷點處函式是被哪些函式按照什麼順序呼叫的? 2、堆疊除錯的技巧 在“Call Stack”對話方塊中顯示了一個呼叫系列,最上面的是當前函式,往下依次是呼叫函式的上級函式,單擊這些函式名可以跳到對 應的函式中。 3、呼叫
程式除錯的時候利用Call Stack視窗檢視函式呼叫資訊
http://blog.csdn.net/augusdi/article/details/6407422 http://blog.csdn.net/zhg598242449/article/details/7591123 首先介紹一下什麼叫呼叫堆疊:假設我們有幾個函式
Golang原始碼學習:使用gdb除錯探究Golang函式呼叫棧結構
本文所使用的golang為1.14,gdb為8.1。 一直以來對於函式呼叫都僅限於函式呼叫棧這個概念上,但對於其中的詳細結構卻瞭解不多。所以用gdb除錯一個簡單的例子,一探究竟。 ## 函式呼叫棧的結構(以下簡稱棧) 棧包含以下作用: - 儲存函式返回地址。 - 儲存呼叫者的rbp。 - 儲存區域性變數。
JVM內存—堆(heap)棧(stack)方法區(method) (轉)
定位 箭頭 環境 構造方法 做的 語言 .com jvm的內存 系列 JAVA的JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method) 堆區:1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
npm install時 報錯Maximum call stack size exceeded
num log ring off npm gpo all 降級 4.0 給npm降級或者升級 降級 : npm install -g [email protected] 升級 : npm install -g npm 升級到最新版npm install時 報錯Maximum call s
C# 編程中的堆棧(Stack)和隊列(Queue)
的區別 bottom seq 序表 gin 數組 src 優秀 順序隊列 一、什麽是堆?(Heap) 堆是無序的,是一片不連續的內存域,由用戶自己來控制和釋放,如果用戶自己不釋放的話,當內存達到一定的特定值時,通過垃圾回收器(GC)來回收。 是程序運行期
棧類Stack
search oat 對象 3.5 nbsp ati 入棧 apple spa Stack類是Vector類的子類。它向用戶提供了堆棧這種高級的數據結構。棧的基本特性就是先進後出。即先放入棧中的元素將後被推出。Stack類中提供了相應方法完成棧的有關操作。 基本方法:
c++ stl棧容器stack用法介紹
stack堆疊容器 堆疊是一個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂(Stack Top),另一端則為棧底(Stack Bottom)。堆疊的元素插入稱為入棧,元素的刪除稱為出棧。由於元素的入棧和出棧總在棧頂進行,因此,堆疊是一個後進先出(Last In First
Java 一維陣列實現一個棧(Stack)類
使用一維陣列編碼實現一個棧(Stack)類,要求提供以下操作:(1)boolean isEmpty():判斷棧當前是否為空;(2)入棧操作void push(obj):把資料元素obj插入堆疊;(3)出棧操作Object pop():出棧,並返回刪除的資料元素;(4)Object get
淺析javascript呼叫棧
轉自https://segmentfault.com/a/1190000010360316 看原文第二個例子的時候真的是一頭霧水,說明和圖怎麼有點搭不上,後面看圖去揣測才明白是什麼意思。為了下次方便理解,稍微修改了下說明,讓自己不會理解錯導致又花時間。 一 什麼是呼叫棧
vue輪播圖報錯 Uncaught RangeError: Maximum call stack size exceeded 附完整輪播圖實現程式碼
Vue初學者,寫專案實現輪播圖時報錯且頁面初始化後不會自動輪播。 設定的計時器時長是6000,但報錯是幾乎沒有停歇的報錯。 檢查核心程式碼,發現 錯誤一:這裡導致輪播圖初始化不輪播 mounted的方法寫在了methods裡面,將mounted的方法挪出,解決頁面初始化輪播圖不
Python實現的棧(Stack)
棧是一種只能在一端進行插入和刪除操作的資料結構。 前言 python本身已有順序表(List、Tupple)的實現,所以這裡從棧開始 什麼是棧 想象在桌子上放一摞書,這就是棧。這堆書的特點就是,最後被堆進去的,永遠在最上面。從這堆書中取出一本書,哪本最方便?還是最上面的那本。
看開原始碼利器—用Graphviz + CodeViz生成C/C++函式呼叫圖(call graph)
一、Graphviz + CodeViz簡單介紹 CodeViz是《Understanding The Linux Virtual Memory Manager》的作者 Mel Gorman 寫的一款分析C/C++原始碼中函式呼叫關係的open source工具(類似的ope
leetcode-155-最小棧(min stack)-java
題目及用例 package pid155; /* 最小棧 設計一個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。 push(x) -- 將元素 x 推入棧中。 pop() -- 刪除棧頂的元素。 top() -- 獲取棧頂元素。
棧的順序儲存結構 順序棧(Sequential Stack) C++
seqStack.h #ifndef __SEQSTACK_H__ #define __SEQSTACK_H__ const int size = 10; template <class T> class seqStack { public: seqStack(vo