1. 程式人生 > >使用gdb和core dump迅速定位段錯誤

使用gdb和core dump迅速定位段錯誤

一、什麼是core dump     core:記憶體、核心的意思;     dump:丟擲,扔出;     core dump:前提:當某程式崩潰的一瞬間,核心會丟擲當時該程式程序的記憶體詳細情況,儲存在一個名叫core.xxx(xxx為一個數字,比如core.699)的檔案中。 二、更改生成的core檔案的大小限制     可見,core檔案是核心生成的,那某一個程序因為段錯誤而崩潰的時候的記憶體映像很大,那必然會生成一個很大的core檔案,所以我們可以通過ulimit命令來設定生成core檔案的大小,例如$ulimit -c unlimited,這裡就是設定生成的core檔案無大小限制。 三、生成core檔案     當第二步完成了,就執行一次那個有問題的程式,然後自然就會因為段錯誤而崩潰,在當前目錄下就生成了core.xxx檔案。 四、分析core檔案

    使用命令$gdb 程式名 core.xxx,然後再輸入where就可以看到產生段錯誤的地方。

cat /proc/sys/kernel/core_pattern
看看core檔案的設定

例如,一個程式cmm_test_tool在執行的時候發生了錯誤,並生成了一個core檔案,如下:

-rw-r–r– 1 root cmm_test_tool.c
-rw-r–r– 1 root cmm_test_tool.o
-rwxr-xr-x 1 root cmm_test_tool
-rw——- 1 root core.19344
-rw——- 1 root core.19351
-rw-r–r– 1 root cmm_test_tool.cfg
-rw-r–r– 1 root cmm_test_tool.res
-rw-r–r– 1 root cmm_test_tool.log
[
[email protected]
_SIM2 mam2cm]#

就可以利用命令gdb進行查詢,引數一是應用程式的名稱,引數二是core檔案,執行
gdb cmm_test_tool core.19344結果如下:

[[email protected]_SIM2 mam2cm]# gdb cmm_test_tool core.19344
GNU gdb Red Hat Linux (5.2.1-4)
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux”…
Core was generated by `./cmm_test_tool’.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/i686/libpthread.so.0…done.
Loaded symbols for /lib/i686/libpthread.so.0
Reading symbols from /lib/i686/libm.so.6…done.
Loaded symbols for /lib/i686/libm.so.6
Reading symbols from /usr/lib/libz.so.1…done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /usr/lib/libstdc++.so.5…done.
Loaded symbols for /usr/lib/libstdc++.so.5
Reading symbols from /lib/i686/libc.so.6…done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/libgcc_s.so.1…done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/ld-linux.so.2…done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2…done.
Loaded symbols for /lib/libnss_files.so.2
#0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6
(gdb)

進入gdb提示符,輸入where,找到錯誤發生的位置和堆疊,如下:

(gdb) where
#0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6
#1 0×4202d4e7 in strtoul () from /lib/i686/libc.so.6
#2 0×0804b4da in GetMaxIDFromDB (get_type=2, max_id=0×806fd20) at cmm_test_tool.c:788
#3 0×0804b9d7 in ConstrctVODProgram (vod_program=0×40345bdc) at cmm_test_tool.c:946
#4 0×0804a2f4 in TVRequestThread (arg=0×0) at cmm_test_tool.c:372
#5 0×40021941 in pthread_start_thread () from /lib/i686/libpthread.so.0
(gdb)

至此,可以看出檔案出錯的位置是函式 GetMaxIDFromDB ,兩個引數分別是2和0×806fd20,這個函式位於原始碼的788行,基於此,我們就可以有針對性的找到問題的根源,並加以解決。


相關推薦

使用gdbcore dump迅速定位錯誤

一、什麼是core dump     core:記憶體、核心的意思;     dump:丟擲,扔出;     core dump:前提:當某程式崩潰的一瞬間,核心會丟擲當時該程式程序的記憶體詳細情況,儲存在一個名叫core.xxx(xxx為一個數字,比如core.6

使用gdbcore dump如何快速定位錯誤

這篇文章主要介紹的就是在產生段錯誤時如何快速定位到錯誤的位置?  一.一個簡單的關於段錯誤的例項 #include<stdio.h> #include<signal.h&

使用gdbcore查詢錯誤

使用gdb和core查詢段錯誤 使用gdb和core查詢段錯誤 當一個程式出現段錯誤時會出現以下提示 檢視core檔案大小限制 將其修改為無限制

【Linux】學會 core dump 事後除錯 快速定位錯誤

環境: centos 6.5 core dump是什麼 其實就是作業系統在程序收到某些訊號而終止執行時,將此時程序地址空間的內容以及有關程序狀態的其他資訊寫出的一個磁碟檔案。最常見的就是段錯誤,然後程式直接掛掉。當程式出現段錯誤時,不要一臉矇蔽,有一

gdb除錯core檔案快速定位core dump位置

core dump又叫核心轉儲, 當程式執行過程中發生異常, 程式異常退出時, 由操作系統把程式當前的記憶體狀況儲存在一個core檔案中, 叫core dump. (linux中如果記憶體越界會收到SIGSEGV訊號,然後就會core dump) 在程式執行的過程中,有的時

gdb調試常用實用命令core dump文件的生成(轉)

targe ini delete 速度 .com 常用 let 設置斷點 locals 1、生成core dump文件的方法: $ ulimit -c //查看是否為0 如果為0 $ ulimit -c unlimited 這樣在程序崩潰以後會在

[skill][debug][gdb] 使用core dump 進行GDB

bsp mit kill nbsp ase pgrep -- org 發生 core dump 掃盲:https://wiki.archlinux.org/index.php/Core_dump 1. 人為制作 core dump   1.1 實時在線生成cor

Linux下利用backtrace追蹤函數調用堆棧以及定位錯誤[轉]

調試 寫入文件 如果 通過 來源 res c函數 glibc tac 來源:Linux社區 作者:astrotycoon 一般察看函數運行時堆棧的方法是使用GDB(bt命令)之類的外部調試器,但是,有些時候為了分析程序的BUG,(主要針對長時間運行程序的分析),在程序

多執行緒中快速定位錯誤位置

參考連結:https://blog.csdn.net/u011426247/article/details/79736111 在做嵌入式Linux開發的時候,程式很容易出現段錯誤。段錯誤一般是記憶體操作指標出錯或是記憶體溢位等問題,有的時候系統會有一點錯誤提示,但有的時候就直接提示個Segmentation

gdb除錯core dump入門實踐(順便複習一下之前介紹過的addr2line命令除錯)

        除錯技能是軟體開發的必備技能, 不會除錯, 就抓不到bug, 就很痛苦。 本文我們來一起聊聊gdb除錯core          Part 1:         在前面的博文中, 我們聊過重要的addr2line除錯, 現在再來一起看看, 就當是複習吧。

嵌入式 linux下利用backtrace追蹤函式呼叫堆疊以及定位錯誤

一般察看函式執行時堆疊的方法是使用GDB(bt命令)之類的外部偵錯程式,但是,有些時候為了分析程式的BUG,(主要針對長時間執行程式的分析),在程式出錯時打印出函式的呼叫堆疊是非常有用的。在glibc標頭檔案"execinfo.h"中聲明瞭三個函式用於獲取當前執行緒的函式呼

Linux下利用backtrace追蹤函式呼叫堆疊以及定位錯誤

一般察看函式執行時堆疊的方法是使用GDB(bt命令)之類的外部偵錯程式,但是,有些時候為了分析程式的BUG,(主要針對長時間執行程式的分析),在程式出錯時打印出函式的呼叫堆疊是非常有用的。 在glibc標頭檔案"execinfo.h"中聲明瞭三個函式用於獲取當前執行緒的

使用GDB分析core dump檔案

到此配置工作完成,下面對core檔案進行分析。 比如我們執行的程式碼出現段錯誤,如下: [[email protected] mywork]# ./testGdb Segmentation fault (core dumped) [[email protected] mywork]#

【Z】錯誤Segment Fault定位,即core dump文件與gdb定位

rect fun 發生 toolbar ulimit top wid title 沒有 使用C++開發系統有時會出現段錯誤,即Segment Fault。此類錯誤程序直接崩潰,通常沒有任何有用信息輸出,很難定位bug,因而無從解決問題。今天我們介紹core dump文件,

錯誤(sgementation fault)核心已轉儲(core dump)的除錯方法

本文主要介紹gdb+core的除錯方法,其他幾種方法的介紹參考:段錯誤產生原因及除錯方法彙總 一、printf方法除錯 二、gdb方法除錯 三、gdb+core檔案的方法除錯,步驟如下,具體參考:gd

Linux下如何生成core dump 文件(解決segment fault錯誤的問題)

http alt 系統設置 images mit 只讀 功能 lin 設置 Linux下的C程序常常會因為內存訪問等原因造成segment fault(段錯誤),如果此時core dump 的功能是打開的,在運行我們的可執行程序時就會生成一個名為core的文件,然後我們就可

GDB core命令的使用調試錯誤

har tdi round image 錯誤 ffffff fff 命令 技術分享 #include <stdio.h> void func(){ int *p = NULL; printf("*p:%d\n", *p);//斷錯誤 } int main(

【Linux】使用gdb快速定位core dump

前言 如果你沒有見過core dumped,說明你不是一個合格的Coder(但並不代表知道就是合格的Coder),在Linux作業系統下,通過gcc、g++編譯出的程式碼就有可能出現這樣的問題(windows下一般都是棧溢位),下面就具體的core dumped

GDB arm-linux交叉編譯移植使用方法(特別是對於正在執行的程式或者錯誤的程式進行分析)

測試程式碼中的test1是用來定位堆疊段錯誤,Delay函式是用來定位程式阻塞,都可以用gdb定位出來,如下:  (1)測試程式執行時首先會有個段錯誤:./gdbtest & [[email protected] user0]$ [65334.020000] pgd = c3e14000 [

GDB除錯常見錯誤

1.基本命令 1)進入GDB  #gdb test   test是要除錯的程式,由gcc test.c -g -o test生成。進入後提示符變為(gdb) 。 2)檢視原始碼  (gdb)