九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
什么是Segmentationfault(CoreDump)?+我遇到的實(shí)例問題

什么是Core Dump?
Core的意思是內(nèi)存, Dump的意思是扔出來, 堆出來.
開發(fā)和使用Unix程序時(shí), 有時(shí)程序莫名其妙的down了, 卻沒有任何的提示(有時(shí)候會(huì)提示core dumped).這時(shí)候可以查看一下有沒有形如core.進(jìn)程號(hào)的文件生成, 這個(gè)文件便是操作系統(tǒng)把程序down掉時(shí)的內(nèi)存內(nèi)容扔出來生成的,它可以做為調(diào)試程序的參考.
core dump又叫核心轉(zhuǎn)儲(chǔ), 當(dāng)程序運(yùn)行過程中發(fā)生異常, 程序異常退出時(shí),由操作系統(tǒng)把程序當(dāng)前的內(nèi)存狀況存儲(chǔ)在一個(gè)core文件中, 叫core dump.

如何使用core文件?
gdb -c core文件路徑 [應(yīng)用程序的路徑]
進(jìn)去后輸入where回車, 就可以顯示程序在哪一行down掉的, 在哪個(gè)函數(shù)中.

為什么沒有core文件生成呢?
有時(shí)候程序down了, 但是core文件卻沒有生成. core文件的生成跟你當(dāng)前系統(tǒng)的環(huán)境設(shè)置有關(guān)系, 可以用下面的語句設(shè)置一下,然后再運(yùn)行程序便成生成core文件.
ulimit -c unlimited
沒有找到core文件,我們改改ulimit的設(shè)置,讓它產(chǎn)生。1024是隨便取的,要是core文件大于1024個(gè)塊,就產(chǎn)生不出來了。)
$ ulimit -c 1024 (轉(zhuǎn)者注:使用-c unlimited不限制core文件大小

core文件生成的位置一般于運(yùn)行程序的路徑相同, 文件名一般為core.進(jìn)程號(hào)

4. 用gdb查看core文件:
下面我們可以在發(fā)生運(yùn)行時(shí)信號(hào)引起的錯(cuò)誤時(shí)發(fā)生core dump了.
發(fā)生core dump之后, 用gdb進(jìn)行查看core文件的內(nèi)容, 以定位文件中引發(fā)core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進(jìn)入gdb后, 用bt命令查看backtrace以檢查發(fā)生程序運(yùn)行到哪里, 來定位coredump的文件->行.

===========================================================================

造成程序core dump的原因很多,這里根據(jù)以往的經(jīng)驗(yàn)總結(jié)一下:

1 內(nèi)存訪問越界

  a) 由于使用錯(cuò)誤的下標(biāo),導(dǎo)致數(shù)組訪問越界

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

  c) 使用strcpy, strcat, sprintf,strcmp, strcasecmp等字符串操作函數(shù),將目標(biāo)字符串讀/寫爆。應(yīng)該使用strncpy, strlcpy,strncat, strlcat, snprintf, strncmp, strncasecmp等函數(shù)防止讀寫越界。

 

2 多線程程序使用了線程不安全的函數(shù)。

應(yīng)該使用下面這些可重入的函數(shù),尤其注意紅色標(biāo)示出來的函數(shù),它們很容易被用錯(cuò):

asctime_r(3c) gethostbyname_r(3n)getservbyname_r(3n) ctermid_r(3s) gethostent_r(3n)getservbyport_r(3n) ctime_r(3c) getlogin_r(3c) getservent_r(3n)fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c) fgetpwent_r(3c)getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c) getnetent_r(3n)gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m)getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c)getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n)getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3)getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c)strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s)getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c)getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)

 

3 多線程讀寫的數(shù)據(jù)未加鎖保護(hù)。

對于會(huì)被多個(gè)線程同時(shí)訪問的全局?jǐn)?shù)據(jù),應(yīng)該注意加鎖保護(hù),否則很容易造成core dump

 

4 非法指針

  a) 使用空指針

  b)隨意使用指針轉(zhuǎn)換。一個(gè)指向一段內(nèi)存的指針,除非確定這段內(nèi)存原先就分配為某種結(jié)構(gòu)或類型,或者這種結(jié)構(gòu)或類型的數(shù)組,否則不要將它轉(zhuǎn)換為這種結(jié)構(gòu)或類型的指針,而應(yīng)該將這段內(nèi)存拷貝到一個(gè)這種結(jié)構(gòu)或類型中,再訪問這個(gè)結(jié)構(gòu)或類型。這是因?yàn)槿绻@段內(nèi)存的開始地址不是按照這種結(jié)構(gòu)或類型對齊的,那么訪問它時(shí)就很容易因?yàn)閎userror而core dump.

 

5 堆棧溢出

不要使用大的局部變量(因?yàn)榫植孔兞慷挤峙湓跅I希?,這樣容易造成堆棧溢出,破壞系統(tǒng)的棧和堆結(jié)構(gòu),導(dǎo)致出現(xiàn)莫名其妙的錯(cuò)誤。

============================================================================

我發(fā)生的問題(待解決中):

main.h:
typedef struct TS_PAT
{
  UINT8 table_id;
  UINT32 zero;
} TS_PAT;

main.c:
TS_PAT *PAT_DataTable;

void Load_PAT_table(FILE *stream){
   PAT_DataTable->table_id = 1;
}
上記代碼,編譯通過。


執(zhí)行時(shí):
Segmentation fault(core dumped)


用上記方法,最后的bt命令輸入后:
#0  0x080486e7 in Load_PAT_table(stream=0x804c050) at main.c:76
76             PAT_DataTable->table_id = 1;
(gdb) bt
#0  0x080486e7 in Load_PAT_table(stream=0x804c050) at main.c:76
#1  0x080487a5 in Parse_Adjust_PAT_table(stream=0x804c050) at main.c:137
#2  0x08049651 in main (argn=3, argc=0xbf96e284)at main.c:827

當(dāng)注釋掉”PAT_DataTable->table_id = 1;“的時(shí)候,沒問題。
否則,在這行賦值語句執(zhí)行時(shí)就down機(jī)。

原因:查明,,未對指針初始化(未分配起指向的內(nèi)存空間)
http://topic.csdn.net/u/20091113/14/da645a0f-8c92-449d-b29d-f6c83561728c.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
coredump簡介與coredump原因總結(jié)
GDB調(diào)試core文件樣例(如何定位Segment fault)
詳談 UNIX 環(huán)境進(jìn)程異常退出
Linux Core Dump
詳解coredump
gdb調(diào)試技巧
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服