1. 程式人生 > >gdb常用除錯命令以及多執行緒堆疊的檢視

gdb常用除錯命令以及多執行緒堆疊的檢視

GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現GDB這個除錯工具有比VC、BCB的圖形化偵錯程式更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。

一般來說GDB主要除錯的是C/C++的程式。要除錯C/C++的程式,首先在編譯時,我們必須要把除錯資訊加到可執行檔案中。使用編譯器(cc/gcc/g++)的 -g 引數可以做到這一點。如:

    > cc -g hello.c -o hello
    > g++ -g hello.cpp -o hello

gdb +程式名  執行(gdb main)

使用 "--tui" 引數,可以在終端視窗上部顯示一個原始碼檢視窗。

gdb --tui main

list(l) 檢視最近10行原始碼

list fun 檢視fun函式原始碼

list file:fun 檢視file檔案中的fun函式原始碼

list num1 num2 檢視num1~num2行的原始碼

break 行號

break fun 在函式處設定斷點

break file:行號 

break file:fun

break if <condition> 條件成立時程式停住

info break (i b)檢視斷點

watch expr expr的值發生改變時,程式停住

delete  n  刪除斷點

run/r 啟動程式

continue(c) 執行至下一個斷點

step(s) 單步跟蹤,進入函式

next(n) 單步跟蹤,不進入函式

finish 執行程式,直到當前函式完成返回,並列印函式返回時的堆疊地址和返回值及引數資訊

until 執行程式直到程式退出迴圈體

print i (p i) 檢視變數的值

ptype 檢視變數型別

print array 檢視陣列

print *[email protected] 檢視動態記憶體

print x=5 改變執行時的資料

print &array 檢視陣列的地址

回車代表上一個命令

core檔案

在程式崩潰時,一般會生成一個檔案叫core檔案。core檔案記錄的是程式崩潰時的記憶體映像,並加入除錯資訊。core檔案生成的過程叫做core dump

設定生成core檔案

ulimit -c 檢視core-dump狀態

ulimit -c 數字 

ulimit -c unlimited 

gdb利用core檔案除錯

gdb 檔名 core檔案

Backtrace(bt)   檢視堆疊

多執行緒除錯

info threads 顯示當前可除錯的所有執行緒

thread ID 切換當前除錯的執行緒為指定ID的執行緒

attach process-id gdb狀態下,開始除錯一個正在執行的程序

thread apply all command 所有執行緒執行command

下面給大家一個好玩的多執行緒程式,答案就在某個執行緒的堆疊中,先不要看下面的答案,自己試著用gdb玩一下哈(Linux 64bit)。

http://download.csdn.net/detail/nk_test/9452236

答案在下面圖中,先不要看。。



The answer is orangutan.

相關推薦

gdb常用除錯命令以及執行堆疊檢視

GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現GDB這個除錯工具有比VC

GDB常用除錯命令(二)

GDB訊號處理       在GDB中使用handle命令定義一個訊號處理。訊號可以以SIG開頭或不以 SIG開頭,可以用定義一個要處理訊號的範圍(如:SIGIO-SIGKILL,表示處理從SIGIO訊號到SIGKILL的訊號,其中包括SIGIO, SIGIOT,S

c++ 網路程式設計(九)TCP/IP LINUX/windows下 執行超詳細教程 以及 執行實現服務端

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <process.h> #include <winsock2.h> #include <win

c++ 網路程式設計(九)TCP/IP LINUX/windows下 執行超詳細教程 以及 執行實現服務端

原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9661012.html  先講Linux下(windows下在後面可以直接跳到後面看): 一.執行緒基本概念 前面我們講過多程序伺服器,但我們知道它開銷很大

Python爬蟲開發(三):資料儲存以及執行

0×00 介紹 本文我們就兩個方面來討論如何改進我們的爬蟲:資料儲存和多執行緒,當然我承認這是為我們以後要討論的一些東西做鋪墊。 本人對於Python學習建立了一個小小的學習圈子,為各位提供了一個平臺,大家一起來討論學習Python。歡迎各位到來Python學習群:960410445一起討論

Python執行以及執行帶來的資料錯亂和死鎖的解決方法

摘至本人有道雲筆記《Python執行緒》 1.python多執行緒的建立 在Python中,同樣可以實現多執行緒,有兩個標準模組thread和threading,不過我們主要使用更高階的threading模組 threading模組提供的類:      Thread,

執行以及執行

標題格   1、執行緒的五種狀態1、執行緒的五種狀態  1)、新建  當new建立一個執行緒,例如new thread(r),執行緒還沒開始執行,處於新建狀態。  2)、就緒  新建的新執行緒並不會自動執行,要執行需要呼叫start()方法建立執行緒執行的系統資源,返回後,此時執行緒就處於就緒狀態。  但是

單例模式--餓漢(按需建立)、懶漢(執行以及執行下改進)

程式碼註釋有介紹,(排版過於難受,下次用md排完再傳上來) package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:15 * @description: 懶漢模式 */ public class SingleTon1

【轉】gcc/g++常用編譯選項和gdb常用除錯命令

  gcc/g++編譯器是我們寫編譯C/C++程式時離不開的編譯工具,而gdb又是除錯C/C++程式的利器,這一篇文章我們記錄一下它們的慣常用法。 gcc/g++常用編譯選項 選項 作

C/C++函式的本質以及執行函式的呼叫過程

C/C++中,函式的本質是一段可執行程式碼,程式碼包括了局部變數、全域性變數的地址等等。到組合語言的級別,變數函式等都可以視為彙編的程式碼片段。函式的本質就是一個可執行程式碼片段的集合 執行緒的詳細介紹:http://www.cnblogs.com/tracylee/archive/

從核心的角度看程序以及執行

  前言:就如我之前所說的一樣,程式只是一個被編譯器(包括彙編器以及聯結器)將你的抽象程式碼轉換為計算機能理解的有一定格式的二進位制檔案,它有一定格式(ELF,PE之類),就如之前的我所說的例子,就好比程式就如一段鐵軌,你是鐵路設計師,編譯器負責把鐵軌做好,那麼之後很多複雜

Linux — 淺析執行以及執行的同步與互斥

                   淺析多執行緒以及多執行緒的同步與互斥 執行緒概念 什麼是執行緒? 執行緒是程序內部的一個執行分支,執行緒的建立成本小於程序.Linux下沒有

gdb常用除錯命令

注:以下內容中,圓括號表示別名,方括號表示可選引數,尖括號表示必須引數。 gdb [檔名]:進入除錯 file <檔名>:載入程式 l(list) [行號或函式名]:列出程式碼 r(run):執行程式/重新執行程式 c(continue):繼續執行 n(ne

執行 以及執行安全

執行緒的執行級別(IRQL) 中斷是指在CPU接到這個請求後停止手上的工作來處理我們的工作(指當出現需要時,CPU暫時停止當前程式的執行轉而執行處理新情況的程式和執行過程) 中斷優先順序是指為使系統能及時響應並處理髮生的所有中斷,系統根據引起中斷事件的重要性和緊迫程度,硬體

[Unity]AssetBundle資源更新以及執行下載

前言 此文章適合不太瞭解資源載入的萌新,有了入門基礎之後再去github上搜大牛寫的專業的資源載入方案才能得心應手,不然的話會看的很吃力或者說一臉懵逼。Unity裡面關於資源載入我們都知道是下載更新AssetBundle,關於AssetBundle我之

開源網路庫boost.asio,libevent,mongoose學習記錄以及執行模式的實現

目錄 IO操作: poll: 總結:    首先說明一下幾個基礎概念:      IO操作: IO操作包括兩個部分:       等待資料準備好:對於一個套介面上的操作,這一步驟關係到資料從網路到達,並將其複製到核心的某個緩

java網路程式設計(一):java傳統的阻塞IO以及執行解決方案

最近在看一些IO模型相關的東西,被同步IO、非同步IO、阻塞IO、非阻塞IO概念弄的有點暈,後面再慢慢學習和領悟。我們以socket IO程式設計為例子,我用的是JDK1.7.0_80,測試工具用的是

GDB 常用除錯命令

呼叫gdb編譯需要在cc後面加 -g引數再加-o; [[email protected] home]#gdb 除錯檔案:啟動gdb (gdb) l :(字母l)從第一行開始列出原始碼 (gdb) break n :在第n行處設定斷點 (gdb) brea

執行以及執行程序的選擇

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

執行檢視JVM中的執行名(ThreadGroup)

ThreadGroup類的常用方法activeCount()——返回此執行緒組中活動執行緒的估計數activeGroupCount()——返回此執行緒組中活動執行緒組的估計數enumerate(Thread[] list,boolean recurse)——把此執行緒組中所有