• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            GLORY | 學(xué)習(xí)·記錄

            coding for life

            UVA 457 | 什么是Core Dump?

            UVA457是個(gè)水題,但是我還是碰到了一些小問題。

            1.開了一個(gè)state[50][42]數(shù)組在main函數(shù)里面,結(jié)果提交之后發(fā)現(xiàn)runtime error,覺著是堆棧溢出了。突然想起來50*42>2000,這種數(shù)組一定是開在main外面的,不然必然堆棧溢出。
            2.是讀題不仔細(xì),當(dāng)成了多重輸入,搞了一個(gè)while(scanf(...)),結(jié)果超時(shí)了。第一次在UVA OJ上面超時(shí)。

            但是這篇文章重點(diǎn)不是講這個(gè),而是講我在運(yùn)行過程中經(jīng)常遇到的core dumped現(xiàn)象。我在網(wǎng)上找到一點(diǎn)資料,貼在下面:

            原帖:http://blogold.chinaunix.net/u3/98822/showart_2093542.html


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

            如何使用core文件?
            gdb -c core文件路徑 [應(yīng)用程序的路徑]
            進(jìn)去后輸入where回車, 就可以顯示程序在哪一行當(dāng)?shù)舻? 在哪個(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)程號

            4. 用gdb查看core文件:
            下面我們可以在發(fā)生運(yùn)行時(shí)信號引起的錯(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)行到哪里, 來定位core dump的文件->行.

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

            造成程序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ù)。

            對于會被多個(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)閎us error而core dump.

            5 堆棧溢出

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

            -------
            我自己程序core dumped就是因?yàn)榈?個(gè)原因,堆棧溢出。我的局部數(shù)組開的過大,而局部變量分配在棧上,導(dǎo)致堆棧溢出。

            posted on 2011-03-14 08:24 meglory 閱讀(553) 評論(0)  編輯 收藏 引用 所屬分類: AlgorithmsLinux

            導(dǎo)航

            隨筆分類

            隨筆檔案

            最新評論

            久久99精品久久久久久hb无码 | 久久久老熟女一区二区三区| 欧美久久亚洲精品| 久久久精品国产免大香伊 | 久久久久女人精品毛片| 成人国内精品久久久久影院| 久久精品国产99国产精品| 狠狠色丁香久久婷婷综合蜜芽五月| 无码人妻久久久一区二区三区| 久久精品嫩草影院| 久久天天躁夜夜躁狠狠躁2022 | 青青久久精品国产免费看| 日产精品久久久久久久性色| 亚洲午夜无码AV毛片久久| 四虎国产永久免费久久| 无码国内精品久久人妻| 国产精品久久久久乳精品爆| 久久精品国产亚洲av高清漫画| 国产精品美女久久久网AV| 久久影院综合精品| 亚洲国产精品无码久久九九 | 久久99精品久久久久久久久久 | www久久久天天com| 久久人妻无码中文字幕| 青青草国产97免久久费观看| 免费国产99久久久香蕉| 69久久精品无码一区二区| 精品综合久久久久久97| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 色婷婷综合久久久久中文字幕| 精品乱码久久久久久久| 久久综合噜噜激激的五月天| 久久精品国产男包| 精品久久久久久国产| 久久亚洲国产成人影院| 怡红院日本一道日本久久| 国产亚洲精久久久久久无码| 77777亚洲午夜久久多喷| 久久精品中文闷骚内射| 一本色道久久综合狠狠躁| 亚洲国产精品无码久久一区二区 |