1. 程式人生 > >linux下除錯方法記錄

linux下除錯方法記錄

1、segment fault

segment fault是幾乎多有C程式設計師都會碰到的問題,多為記憶體問題,因為glibc庫中基本所有的函式都預設形參指標是非空的,這樣以下原因就可能導致段錯誤:

(1)引用一個包含非法值的指標(當然包括空指標)。
(2)未得到正確的許可權的時候進行訪問,例如往只讀的記憶體地址寫資料。
(3)記憶體越界(陣列越界,變數型別不一致等)

除錯segment fault的幾種常見方法:

(1) 列印log,這種方法的前提是你知道在哪行程式碼附近會出問題;

(2) gdb除錯,對於小程式碼,可以逐行除錯,大工程就比較頭疼咯;

(3) core dump除錯,當一個程式崩潰時,在程序當前工作目錄的core檔案中複製了該程序的儲存影象。core檔案僅僅是一個記憶體映象(同時加上除錯資訊),主要是用來除錯的。

首先,設定core大小

#設定core大小為無限
ulimit -c unlimited
#設定檔案大小為無限
ulimit unlimited

使用core檔案除錯程式

看下面的例子:

/*core_dump_test.c*/
#include <stdio.h>
const char *str = "test";
void core_test(){
    str[1] = 'T';
}

int main(){
    core_test();
    return 0;
}

編譯:
gcc–g core_dump_test.c -o core_dump_test

如果需要除錯程式的話,使用gcc編譯時加上-g選項,這樣除錯core檔案的時候比較容易找到錯誤的地方。

執行:
./core_dump_test
段錯誤

調式core檔案
core檔案是個二進位制檔案,需要用相應的工具來分析程式崩潰時的記憶體映像,在Linux下可以用GDB來除錯core檔案。
gdb core_dump_test core

Loaded symbols for /lib/ld-linux.so.2
#0 0x080482fd in core_test () at core_dump_test.c:7
7           str[1] = 'T';
(gdb) where
#0 0x080482fd in core_test () at core_dump_test.c:7
#1 0x08048317 in main () at core_dump_test.c:12
#2 0x42015574 in __libc_start_main () from /lib/tls/libc.so.6
GDB中鍵入where,就會看到程式崩潰時堆疊資訊(當前函式之前的所有已呼叫函式的列表(包括當前函式),gdb只顯示最近幾個),我們很容易找到我們的程式在最後崩潰的時候呼叫了core_dump_test.c第7行的程式碼,導致程式崩潰。注意:在編譯程式的時候要加入選項-g。您也可以試試其他命令, 如 fram、list等。更詳細的用法,請查閱GDB文件。

相關推薦

linux除錯方法記錄

1、segment fault segment fault是幾乎多有C程式設計師都會碰到的問題,多為記憶體問題,因為glibc庫中基本所有的函式都預設形參指標是非空的,這樣以下原因就可能導致段錯誤: (1)引用一個包含非法值的指標(當然包括空指標)。 (2)未得到正確的許可

Linux除錯段錯誤的方法[Segmentation Fault]--GDB

4. 段錯誤的除錯方法 4.1 使用printf輸出資訊 這個是看似最簡單但往往很多情況下十分有效的除錯方式,也許可以說是程式設計師用的最多的除錯方式。簡單來說,就是在程式的重要程式碼附近加上像printf這類輸出資訊,這樣可以跟蹤並打印出段錯誤在程式碼中可能出現的位置。為了方便使用這種方法,可以使用

mysql 忘記了root的password(linux解決方法,window同理)

.cn rac oot 命令行 linu size word sta ont mysql 忘記了root的password的時候的解決步驟, 1: cd /etc/mysql/(進入mysql的配置文件夾) 2:vim my.cnf \skip-grant-t

linux 除錯coredump檔案

1、coredump簡介 在linux後臺開發過程中可能一不小心出現訪問非法記憶體而產生段錯誤,面對段錯誤我們有時候可以通過列印定位,但那樣比較慢,我們可以利用linux提供了一種方法,當程式奔潰時核心會儲存程式執行的堆疊資訊到一個coredump檔案,我們可以通過gdb除錯這個coredump

linux各種方法檢視tomcat日誌以及檢視檔案內容指令

寬巨集大量,是惟一能夠照亮偉大靈魂的光芒。——《巴黎聖母院》 1、引言 本週在Linux部署springboot專案的時候,採用自動化部署,一直以來都採用jar包的部署方式,本次採用war包的方式部署到tomcat容器。雖然我在專案中配置了Log

linux核心除錯方法

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。 一  除錯前的準備 在除錯一個bug之前,我們所要做的準備工作有: 有一個被確認的bug。 包含這個bug的核心

linux移植libcurl記錄

移植過程主要參考部落格: https://blog.csdn.net/wuzhiwuweisun/article/details/79129838 也借鑑了部落格:https://blog.csdn.net/zhouzhenhe2008/article/details/53768854

Linux核心除錯方法總結

核心開發比使用者空間開發更難的一個因素就是核心除錯艱難。核心錯誤往往會導致系統宕機,很難保留出錯時的現場。除錯核心的關鍵在於你的對核心的深刻理解。  一  除錯前的準備 在除錯一個bug之前,我們所要做的準備工作有:  有一個被確認的bug。 包含這

如何使用加多寶(jdb)在linux除錯Java程式

畢業時寫了一段時間的C,那時候除錯使用gdb,後來轉了java,當時就想java程式怎麼除錯,找了一下,果然,那就是jdk自帶的jdb windows裡是這樣的 Linux下是這樣的 一般我在linux下來除錯Java程式  好,那麼,問題來了,這玩意怎麼用?有好幾種玩法 第一種玩

jlink linux除錯

1.去官網 下載 v4.80的linux版本的 驅動,我的是feora, 下載rpm包,直接安裝,路徑 是  /opt/SEGGER 2.連上 jlink,開啟 JlinkGDBServer 3.arm-linux-insight開啟,就可是除錯了, 編譯的時候,s,c檔案

linux除錯linux0.11

image直接用的這裡的http://oldlinux.org/Linux.old/Linux-0.11/images/ insight-6-8-1編譯 yum install nc

linux 核心除錯方法

kdb:只能在彙編程式碼級進行除錯;   優點是不需要兩臺機器進行除錯。   gdb:在除錯模組時缺少一些至關重要的功能,它可用來檢視核心的執行情況,包括反彙編核心函式。   kgdb:能很方便的在原始碼級對核心進行除錯,缺點是kgdb只能進行遠端除錯,它需要一根串列埠線及兩臺機器來除錯核心(也可以是在同一

【GDB】Linux除錯程式

引言:GDB是GUN釋出的一款功能強大的程式除錯工具。 * GDB主要完成下面三個方面的功能:  1、啟動被除錯的程式; 2、指定程式在某個位置暫停; 3、當程式暫停時,可以檢查程式的狀態(包括變數值等)。 * GDB使用方法: 1、編譯生成的可執行檔案: gcc

linux nf_conntrack_tuple 跟蹤記錄

struct nf_conn {/* Usage count in here is 1 for hash table/destruct timer, 1 per skb, plus 1 for any connection(s) we are `master' for */

linuxhistory命令顯示歷史指令記錄的使用方法

語法 tex 系統 linux下 命令 過程 相關 不堪 中間 linux下history命令顯示歷史指令記錄的使用方法 History命令主要用於顯示歷史指令記錄內容, 下達歷史紀錄中的指令 。1>History命令語法: [test@li

Linux清空使用者登入記錄和命令歷史的方法

清除登陸系統成功的記錄,也就是last命令看到的記錄 [[email protected] ~]# echo > /var/log/wtmp 此檔案預設開啟時亂碼的,裡面可以看到ip等等資訊 [[email protected] ~]# echo >/va

Linuxis not in the sudoers file解決方法解決記錄

https://www.cnblogs.com/lazzyk/p/6264012.html 參照文章 最近在學習linux,在某個使用者(xxx)下使用sudo的時候,提示以下錯誤:xxx is not in the sudoers file. This incident will be r

linux的程式除錯方法彙總

       搞電子都知道,電路不是焊接出來的,是調試出來的。程式設計師也一定認同,程式不是寫出來的,是調試出來的。那麼除錯工具就顯得尤為重要,linux作為筆者重要的開發平臺,在linux中討論除錯工具主要是為那些入門者提供一些幫助。除錯工具能讓我們能夠監測

Linux環境段錯誤的產生原因及除錯方法小結(轉)

轉自 最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的段錯誤

Linux的段錯誤(Segmentation fault)產生的原因及除錯方法

 段錯誤 就是訪問了錯誤的記憶體段,一般是你沒有許可權,或者根本就不存在對應的實體記憶體,尤其常見的是訪問0地址.         一 般來說,段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間,通常這個值是由gdtr來儲存的是一個48位的暫存器,              前32位是儲存由它指