GDB調試core文件樣例(如何定位Segment fault)

core dump又叫核心轉儲, 當程序運行過程中發生異常, 程序異常退出時, 由操作系統把程序當前的內存狀況存儲在一個core文件中, 叫core dump. (Linux中如果內存越界會收到SIGSEGV信號,然后就會core dump)

在程序運行的過程中,有的時候我們會遇到Segment fault(段錯誤)這樣的錯誤。這種看起來比較困難,因為沒有任何的棧、trace信息輸出。該種類型的錯誤往往與指針操作相關。往往可以通過這樣的方式進行定位。

一 造成segment fault,產生core dump的可能原因

1.內存訪問越界

?a) 由于使用錯誤的下標,導致數組訪問越界

?b) 搜索字符串時,依靠字符串結束符來判斷字符串是否結束,但是字符串沒有正常的使用結束符

?c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函數,將目標字符串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。

2 多線程程序使用了線程不安全的函數。

3 多線程讀寫的數據未加鎖保護。對于會被多個線程同時訪問的全局數據,應該注意加鎖保護,否則很容易造成core dump

4 非法指針

a) 使用空指針

b) 隨意使用指針轉換。一個指向一段內存的指針,除非確定這段內存原先就分配為某種結構或類型,或者這種結構或類型的數組,否則不要將它轉換為這種結構或類型的指針,而應該將這段內存拷貝到一個這種結構或類型中,再訪問這個結構或類型。這是因為如果這段內存的開始地址不是按照這種結構或類型對齊的,那么訪問它時就很容易因為bus error而core dump.

5 堆棧溢出.不要使用大的局部變量(因為局部變量都分配在棧上),這樣容易造成堆棧溢出,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。

二?配置操作系統使其產生core文件

首先通過ulimit命令查看一下系統是否配置支持了dump core的功能。通過ulimit -c或ulimit -a,可以查看core file大小的配置情況,如果為0,則表示系統關閉了dump core。可以通過ulimit -c unlimited來打開。若發生了段錯誤,但沒有core dump,是由于系統禁止core文件的生成。

解決方法:
$ulimit -c unlimited  (只對當前shell進程有效)
或在~/.bashrc 的最后加入:?ulimit -c unlimited?(一勞永逸)

# ulimit -c

0

?

$?ulimit -a

core file size????????? (blocks, -c) 0

data seg size?????????? (kbytes, -d) unlimited

file size?????????????? (blocks, -f) unlimited

三?用gdb查看core文件

發生core dump之后, 用gdb進行查看core文件的內容, 以定位文件中引發core dump的行.

gdb [exec file] [core file]

如:?gdb ./test test.core

?

四?樣例

?

1. 空指針

樣例:

#include <stdio.h>

int main(void)

{

??? printf("hello world! dump core for set value to NULL pointer/n");

??? *(char *)0 = 0;

??? return 0;

}

# gcc -g test.c -o test

# ./test

hello world! dump core for set value to NULL pointer

Segmentation fault????

/× Get segmentation fault, but there is no core dump. The reason is that the system configure core file size to zero ×/

# ls

test? test.c

/* Set core file size to unlimited?*/

# ulimit -c unlimited

# ./test

hello world! dump core for set value to NULL pointer

Segmentation fault (core dumped)

/* Get core dump after change core file size.?*/

# ls

core.5581? test? test.c

/* gdb to?debug core dump?*/

# gdb test core.5581
GNU gdb Red Hat linux (6.3.0.0-1.132.EL4rh)
Copyright 2004 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 "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib64/tls/libc.so.6...done.
Loaded symbols for /lib64/tls/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
#0? 0x000000000040048b in main () at test.c:6

warning: Source file is more recent than executable.

6?????????? *(char *)0 = 0;
(gdb) bt
#0? 0x000000000040048b in main () at test.c:6
?

2. 棧溢出。

有關棧溢出的程序,請參見:一個測試棧大小的小程序

http://blog.163.com/huang_bp/blog/static/12311983720099150746901/edit/

?

?

# gcc -g test.c -o test -lpthread

# ls

test? test.c

# ./test

...

Segmentation fault (core dumped)

# ls

core.5616? test? test.c

# gdb test core.5616
GNU gdb Red Hat Linux (6.3.0.0-1.132.EL4rh)
Copyright 2004 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 "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib64/tls/libpthread.so.0...done.
Loaded symbols for /lib64/tls/libpthread.so.0
Reading symbols from /lib64/tls/libc.so.6...done.
Loaded symbols for /lib64/tls/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
#0? 0x0000002a957c051e in vfprintf () from /lib64/tls/libc.so.6
(gdb) list
13
14???????? buffer[0]=i;
15????????? test(s);
16????? }
17
18????? int?? main()
19????? {
20????????? pthread_t p;
21
22????????? pthread_create(&p, NULL, &test, NULL);

對于棧溢出的segment fault沒有第一個定位方便,需要分析代碼才能判斷出原因。

================================================================
推薦參考:
Linux下的段錯誤產生的原因及調試方法
http://www.upsdn.net/html/2006-11/775.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252913.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

管理信息系統的開發與管理

{% extendsmuban.html %} {% block head %}輸入{% endblock %} {% block main %} <div><div class"form-group"><label for"question">標題</label><textarea class"form-control" cols"50" rows"2&q…

python11-28筆記(1.6-1.7)

1.6 多類型傳值和冗余參數多類型傳值&#xff1a;比如def fun(x,y)&#xff0c;定義2個形參定義一個元組t(1,2),如果把元組當做實參傳入到函數中&#xff0c;會報錯 如何將元組當做不同類型的參數傳入到函數中fun(t) 代表傳入的是元組或者這樣調用fun((1,2))注意實參的個數要和…

session機制詳解以及session的相關應用

session是web開發里一個重要的概念&#xff0c;在大多數web應用里session都是被當做現成的東西&#xff0c;拿來就直接用&#xff0c;但是一些復雜的web應用里能拿來用的session已經滿足不了實際的需求&#xff0c;當碰到這樣的情況時候我們需要更加深入的理解session的機制&am…

(轉)Shell中獲取字符串長度的七種方法

Shell中獲取字符串長度的七種方法 原文&#xff1a;http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell腳本中很常用&#xff0c;下面歸納、匯總了求字符串的幾種可能方法: 【方法一】:利用${#str}來獲取字符串的長度 【方法二】:利用awk的length方…

linux下用core和gdb查詢出現段錯誤的地方

有些時候我們在一段C代碼的時候&#xff0c;由于對一個非法內存進行了操作&#xff0c;在程序運行的過程中&#xff0c;出現了"段錯誤"。呵呵&#xff0c;這種問題我想很多人會經常遇到。遇到這種問題是非常無語的&#xff0c;只是提示了"段錯誤"&#xff…

第一篇-Html標簽中head標簽,body標簽中input系列,textarea和select標簽

第十四周課程&#xff08;1-12章節&#xff09; HTML 裸體 CSS 穿華麗衣服 Javascript 動起來 一 HTML &#xff08;20個標簽&#xff09; 1.我們的瀏覽器是socket客戶端 2.一套規則&#xff0c;瀏覽器認識的規則 3.開發者&#xff1a; 學習html規則 開發后臺程序&#xff1a…

opencv3.2.0 Cmake 3.8.0 + tdm-gcc-5.1.0-3

實測 tdm-gcc-5.1.0-3 tdm32-1 32位版本無法正確編譯Opencv 3.2.0 會遇到諸多編譯問題 解決辦法 使用tdm-gcc-5.1.0-2 tdm64-1 64位版本轉載于:https://www.cnblogs.com/fundou/p/6710209.html

什么是商品屬性

一、什么是商品屬性&#xff1a; Definition of Product Attributes A product attribute is a characteristic that defines a particular product and will affect a consumers purchase decision. Product attributes can be tangible (or physical in nature) or intangibl…

linux用戶管理(1)----創建用戶(adduser和useradd)和刪除用戶(userdel)

arm linux的系統用戶管理&#xff1a; 1、刪除root用戶&#xff1a;deluser root2、刪除tt用戶:deluser tt3、建立root用戶&#xff1a;adduser root4、修改用戶密碼&#xff1a;登錄相應的用戶后&#xff0c;用passwd來修改密碼4、linux用戶和密碼的管理&#xff08;ftp&#…

前端性能優化之圖像優化原理

前端性能優化中&#xff0c;圖像的優化是非常重要的一環&#xff0c;為什么要說圖像的優化呢&#xff0c;而不是我們常見的圖片優化&#xff1f;因為這里的圖像包括矢量圖和位圖&#xff0c;我們常說的圖片優化是指位圖的優化。這篇文章轉載至奇舞周刊&#xff0c;大佬總結的非…

Lua開發學習4-普通循環和迭代器循環

說句實話&#xff0c;每當看到Lua代碼&#xff0c;我都感覺是半個SQL代碼&#xff0c;寫起來還是感覺有點恐怖。 while循環&#xff1a; 與C#的while循環類似&#xff0c;沒有什么好說的&#xff1b; --------Lua的while循環 while(condition)dostatementsend For循環 exp1為起…

什么是js的嚴格模式

設立嚴格模式的原因&#xff1a; - 消除Javascript語法的一些不合理、不嚴謹之處&#xff0c;減少一些怪異行為; - 消除代碼運行的一些不安全之處&#xff0c;保證代碼運行的安全&#xff1b; - 提高編譯器效率&#xff0c;增加運行速度&#xff1b; - 為未來新版本的Javascrip…

Linux驅動設計ioctl函數的cmd參數不能為2

Linux驅動程序設計的時候偶然發現的ioctl()函數的cmd參數不能為2&#xff0c;如果為2,ioctl()函數返回-1&#xff0c;網上說就是這樣的&#xff0c;正常&#xff0c;不知道為什么&#xff0c;stack overflow上有一個外國學友的建議&#xff1a; “In general, you want to comp…

代碼解說Android Scroller、VelocityTracker

在編寫自己定義滑動控件時經常會用到Android觸摸機制和Scroller及VelocityTracker。Android Touch系統簡單介紹&#xff08;二&#xff09;:實例具體解釋onInterceptTouchEvent與onTouchEvent的調用過程對Android觸摸機制須要用到的函數進行了具體的解釋。本文主要介紹兩個重要…

Effective_STL 學習筆記(四十四) 盡量使用成員函數代替同名的算法

有些容器擁有和 STL 算法同名的成員函數。 關聯容器提供了 count、find、lower_bound、upper_bound 和 euqal_range list 提供了 remove、remove_if、unique、merge 和 reverse 大多數時候應該用成員函數代替手寫算法&#xff0c;這樣做的兩個理由&#xff1a; 比起算法&#x…

(NFS移植到arm上)編譯portmap和nfs-utils

為了在播放機上實現NFS服務器的功能&#xff0c;我們已經在uClibc中打開了完整RPC支持&#xff0c;并且在新編譯的內核中打開了NFS服務器支持。此外還有兩個軟件包也是提供NFS服務所必需的&#xff1a;portmap和nfs-utils。portmap為RPC程序提供端口映射服務&#xff0c;nfs-ut…

HTML5上傳預覽

http://cobain-li.iteye.com/blog/2296538轉載于:https://www.cnblogs.com/winyh/p/7850049.html

支付寶支付

1 申請商戶平臺 2 申請開放平臺 3 申請APP支付 4 創建應用 (名稱&#xff0c;logo) 5 生成RSA秘鑰&#xff08;公鑰&#xff0c;私鑰&#xff09; 6 在應用中配置公鑰 7 配置其他內容&#xff0c;包括iOS bundle ID。配置安卓包名&#xff0c;和簽名。 獲取appid&#xff0c;公…

HttpRequest Java原生代碼封裝

HttpRequest Java原生代碼封裝 get提交 post提交 name1value1&name2value2 的形式 json形式兩種形式 package com.beisun.mbp.mbp.controller;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…

Linux 系統目錄

/ 根目錄 /bin 存放必要的命令 /boot 存放內核以及啟動所需的文件等 /dev 存放設備文件 /etc 存放系統的配置文件 /home 用戶文件的主目錄&#xff0c;用戶數據存放在其主目錄中 /lib 存放必要的運行庫 /mnt 存放臨時的映射文件系統&#xff0c;我們常把軟驅和光驅掛裝在這里的…