最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux下關于coredump的定位方法說明

 更新時間:2023年09月04日 08:52:53   作者:凌肖戰(zhàn)  
這篇文章主要介紹了Linux下關于coredump的定位方法說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一. Linux 下 cordump 機制

Linux 系統(tǒng)下存在一種 coredump 機制。

當程序運行過程中異常終止或崩潰,Linux 操作系統(tǒng)會將程序當時的堆棧等內存狀態(tài)信息記錄下來,會在指定文件下生成一個 coredump 相關的 Log 文件。

軟件開發(fā)人員可以通過對 coredump文件進行分析,即可定位到導致程序運行崩潰的 bug。

當程序訪問的內存超過了系統(tǒng)給定的內存空間,就會產生 Segmentation fault(core dumped),所以:

一般產生段錯誤的原因有如下:

  • 1. 訪問了不存在的內存地址。
  • 2. 訪問了系統(tǒng)保護的內存地址。
  • 3. 數(shù)組或堆空間訪問越界,等等一系列內存非法訪問操作。

二. coredump 文件定位方法

根據(jù)上一篇配置 coredump 機制的方法,成功配置好之后。

就可以運行代碼,當程序運行中崩潰時即可產生相應的 coredump 文件。

操作如下:

  • 1. 首先,開啟 coredump 功能。設置成功后,可以通過 ulimit -c 命令驗證。
  • 2. 其次,關閉 ubuntu 系統(tǒng)下 apport.service 服務程序。
  • 3. 其次,編譯代碼。編譯時必須加 -g 編譯選項(帶調試信息的編譯選項)。
  • 4. 最后,運行程序。當程序運行時出現(xiàn) 核心轉儲等提示錯誤時,即可生成 coredump 文件。

這里為了方便起見,不更改 coredump 文件的生成路徑,即生成的 coredump 文件會與可執(zhí)行程序在同一目錄下,文件默認叫 core 的文件。

下面以一段測試代碼說明一下,Linux 環(huán)境下 使用 gdb 調試器對 coredump 文件進行分析調試。

代碼如下:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
int fun()
{
    printf("---fun()\n");
    char buffer[3] = {0}; 
    memcpy(buffer, "Hello", 6);  
    printf("---buffer: %s\n", buffer);  
    return 0;
}
int main()
{
    printf("---main()---\n");   
    int pid = 0;
    pid = getpid();
    printf("pid %d\n", pid);
    fun(); 
    printf("---End main\n");
    return 0;
}

1. 編譯運行

操作如下:

編譯代碼。輸入 gcc -g main.c -o main.out 命令

運行程序。輸入 ./main.out 命令。

如下所示:

wangtian@wangtian-virtual-machine:~/Code_Learns/C_Learns/debug/debug2$ ./main.out 
---main()---
pid 3814
---fun()
---buffer: Hello
*** stack smashing detected ***: terminated
已放棄 (核心已轉儲)

當程序出現(xiàn)段錯誤時崩潰時,可查看程序當前目錄下是否生成 coredump 相關文件。

如下所示:

wangtian@wangtian-virtual-machine:~/Code_Learns/C_Learns/debug/debug2$ ls -l
總用量 180
-rw------- 1 wangtian wangtian 393216 12月 13 16:55 core
drwxrwxr-x 2 wangtian wangtian   4096 11月 25 22:24 debug
-rw-rw-r-- 1 wangtian wangtian     90 10月 28 13:32 debug.c
-rw-rw-r-- 1 wangtian wangtian     81 10月 20 18:12 debug.h
-rw-rw-r-- 1 wangtian wangtian   5688 12月 13 16:55 debug.o
-rw-rw-r-- 1 wangtian wangtian    356 12月 13 16:55 main.c
-rw-rw-r-- 1 wangtian wangtian   7144 12月 13 16:55 main.o
-rwxrwxr-x 1 wangtian wangtian  21144 12月 13 16:55 main.out

2. gdb 調試 coredump 文件

查看 coredump 文件。

輸入 objdump -t core 命令:

wangtian@wangtian-virtual-machine:~/Code_Learns/C_Learns/debug/debug2$  objdump -t core
core:     文件格式 elf64-x86-64
SYMBOL TABLE:
無符號

可以看到,coredump 文件是不帶符號表的。

所以調試時,需要同時加上 可執(zhí)行程序文件。

輸入命令 gdb main.out core 進行調試,如下所示:

wangtian@wangtian-virtual-machine:~/Code_Learns/C_Learns/debug/debug2$ gdb main.out core
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main.out...
[New LWP 4272]
Core was generated by `./main.out'.
Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50	../sysdeps/unix/sysv/linux/raise.c: 沒有那個文件或目錄.

可以看到,程序收到 signal SIGABRT 后崩潰了。

輸入 bt (backtrace 縮寫) 命令,可以查看下程序崩潰時的堆棧信息,

如下所示:

(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ff8d6f5c859 in __GI_abort () at abort.c:79
#2  0x00007ff8d6fc729e in __libc_message (action=action@entry=do_abort, 
    fmt=fmt@entry=0x7ff8d70f108f "*** %s ***: terminated\n")
    at ../sysdeps/posix/libc_fatal.c:155
#3  0x00007ff8d7069aea in __GI___fortify_fail (
    msg=msg@entry=0x7ff8d70f1077 "stack smashing detected") at fortify_fail.c:26
#4  0x00007ff8d7069ab6 in __stack_chk_fail () at stack_chk_fail.c:24
#5  0x000056183642c243 in fun () at main.c:12
#6  0x000056183642c28c in main () at main.c:20

以上的堆棧信息,顯示 __stack_chk_fail () 錯誤??梢钥吹秸{用 fun() 函數(shù)過程中發(fā)生了棧問題。

__stack_chk_fail () 打印信息說明發(fā)生了緩沖區(qū)溢出,即數(shù)組越界問題。

從這段棧信息中并不能直觀的定位到出現(xiàn)問題的地方,因為出現(xiàn)問題的地方是之前的數(shù)組越界,但是這里的棧信息已經執(zhí)行到主函數(shù) main中, 特別是在大項目中更是無法準確的定位出錯的地方。

越界寫壞內存,什么時候會 crash 取決于我們寫壞的內存什么時候被用到,有時候會離犯罪現(xiàn)場特別遠。所以,導致定位這樣情況的崩潰問題比較麻煩。

在發(fā)生__stack_chk_fail () 錯誤的附近函數(shù) fun() 中第11 行打斷點,如下所示:

(gdb) b main.c:11
Breakpoint 1 at 0x56183642c22a: file main.c, line 11.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000056183642c22a in fun at main.c:11
(gdb) r
Starting program: /home/wangtian/Code_Learns/C_Learns/debug/debug2/main.out 
---main()---
pid 3868
---fun()
---buffer: Hello
Breakpoint 1, fun () at main.c:11
11	    return 0;
(gdb) n
12	}
(gdb) 
*** stack smashing detected ***: terminated
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50	../sysdeps/unix/sysv/linux/raise.c: 沒有那個文件或目錄.
(gdb) 

初步可以定位到,是在函數(shù) fun() 內部發(fā)生了數(shù)組越界問題。目前還不能定位到具體某一行。

canary 棧溢出保護機制的具體原理:

  • gcc 編譯器默認開啟了 canary 棧保護機制。
  • canray 棧保護機制是專門針對棧溢出攻擊涉及的一中保護機制。
  • 由于棧溢出攻擊的主要目標是通過溢出覆蓋函數(shù)棧高位的返回地址,因此,其思路是在函數(shù)開始執(zhí)行前,即返回地址前寫入一個字長的隨機數(shù)據(jù)(canary),在函數(shù)返回前校驗該值是否被改變,如果改變則認為是棧溢出,程序直接終止,以此來防止信息泄露。

總結

以上一系列的操作,說明通過 gdb 對 數(shù)據(jù)越界問題的調試定位,這種方法不是太好用。

原因:越界寫壞內存,什么時候會 crash 取決于我們寫壞的內存什么時候被用到,有時候會離犯罪現(xiàn)場特別遠。所以,導致定位這樣情況的崩潰問題比較麻煩。后續(xù)文章再針對數(shù)組越界問題定位方法進行新的總結。

好了,以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Linux系統(tǒng)配置sftp服務以及實現(xiàn)免密登錄方式

    Linux系統(tǒng)配置sftp服務以及實現(xiàn)免密登錄方式

    這篇文章主要介紹了Linux系統(tǒng)配置sftp服務以及實現(xiàn)免密登錄方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Centos環(huán)境下安裝Zend optimizer 3.3.9的方法

    Centos環(huán)境下安裝Zend optimizer 3.3.9的方法

    這篇文章主要介紹了Centos環(huán)境下安裝Zend optimizer 3.3.9的方法,簡單說明了CentOS服務器環(huán)境下安裝Zend optimizer 3.3.9的相關下載、解壓、安裝、配置等操作步驟與相關注意事項,需要的朋友可以參考下
    2018-03-03
  • Linux定時任務Crontab的使用方法

    Linux定時任務Crontab的使用方法

    這篇文章主要為大家詳細介紹了Linux定時任務Crontab的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • linux中的7z命令參數(shù)說明

    linux中的7z命令參數(shù)說明

    Linux中的7z命令具備多樣的參數(shù)來控制其功能,如添加文件、刪除、提取、更新存檔等。常用的命令包括a、d、e、x等,而開關如-o、-p、-m等則進一步定義了操作的細節(jié),例如設置密碼、輸出目錄和壓縮方法。此命令強大且靈活,適合進行文件壓縮和管理
    2024-09-09
  • linux Apache服務器系統(tǒng)安全設置與優(yōu)化

    linux Apache服務器系統(tǒng)安全設置與優(yōu)化

    結合,mod_gzip 和緩沖工具等,我們完全可以使一臺配置較低的 PC 有足夠的能力處理各種 HTML/CGI 等的請求。
    2008-07-07
  • linux下FastDFS搭建圖片服務器

    linux下FastDFS搭建圖片服務器

    大家好,本篇文章主要講的是linux下FastDFS搭建圖片服務器,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • CentOS下MySQL的徹底卸載的幾種方法

    CentOS下MySQL的徹底卸載的幾種方法

    本篇文章主要介紹了CentOS下MySQL的徹底卸載的幾種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 高性能HTTP加速器Varnish-3.0.3搭建、配置及優(yōu)化步驟

    高性能HTTP加速器Varnish-3.0.3搭建、配置及優(yōu)化步驟

    這篇文章主要介紹了高性能HTTP加速器Varnish-3.0.3搭建、配置及優(yōu)化步驟,需要的朋友可以參考下
    2016-02-02
  • Ubuntu20.04安裝配置GitLab的方法步驟

    Ubuntu20.04安裝配置GitLab的方法步驟

    這篇文章主要介紹了Ubuntu20.04安裝配置GitLab的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Linux CentOS 6.5 卸載、tar安裝MySQL的教程

    Linux CentOS 6.5 卸載、tar安裝MySQL的教程

    這篇文章主要介紹了Linux CentOS 6.5 卸載、tar安裝MySQL的教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-11-11

最新評論

金山区| 宁强县| 泸定县| 瑞安市| 资阳市| 克山县| 武鸣县| 龙陵县| 神木县| 固安县| 普格县| 康乐县| 梧州市| 林口县| 德钦县| 金坛市| 义马市| 南乐县| 大城县| 旌德县| 蒙山县| 高密市| 兴宁市| 磐石市| 曲周县| 司法| 邯郸县| 搜索| 深水埗区| 和林格尔县| 阆中市| 英德市| 宁乡县| 黎平县| 贵州省| 锡林浩特市| 浦县| 左云县| 南岸区| 明光市| 调兵山市|