• <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>

            馭風萬里無垠

            利用LD_PRELOAD發現程序潛在的問題

            Solaris上,常常可以用LD_PRELOAD輔助mdb做一些調試、測試工作,可以發現一些其它手段難以發現的問題;最近就遇到一個。

            事情源于替換了程序中的某個基礎部分之后,程序運行起來占用的物理內存有了較為顯著的增加,卻難以一下子拿出來個讓人信服的原因。于是自然想到了去看一下程序真正運行的時候,某一部分內存是誰分配的。之前用 pmap -xalsF pid發現【heap】部分有顯著增加,又不是在新加入的那個動態庫里邊。
            Solaris上有強大的mdb,輔助不同的模塊可以得出很多有意思的結論,其中libumem.so即可以查看內存的分配的情況,并可以檢測是否有內存泄漏。
            啟動的方法很簡便:
            export UMEM_DEBUG=default
            export UMEM_LOGGING=transaction
            LD_PRELOAD=/lib/libumem.so
            export LD_PRELOAD
            然后在此shell中啟動程序,新打開一個終端,同樣設置好LD_PRELOAD(否則會提示錯誤),
            查找正運行的程序的進程號(調試的程序),生成一個core文件:
            ps -ef | grep <appname>
            gcore 
            <pid>
            ls core.
            <pid>
            用mdb打開新生成的core文件,第一行應該提示加載了libumem.so.
            接下來,用libumem.so提供的walker和dcmds就可以查詢程序運行以來到產生core文件的那一時間點豐富的內存信息了.
            mdb core.pid
            >::findleaks
            >::umalog
            >::umem_log
            更多可用的命令,可以用::dmods -l查看。

            整個過程非常繁雜,因為應用程序比較大,分配內存的log實在是太多了,但是突然發現運行目錄下邊多了不少core文件,一下子奇怪了,之前可是花費了很多時間在提高代碼質量上,按道理不應該會有core產生了。打開這些core,用pstack,居然發現某個模塊啟動的子進程在調用free的地方abort了,按圖索驥查看代碼,在某個旮旯里邊,幾年沒人動的小角落里,發現分配內存的地方:
            char* path1 = getenv("MYENV");
            char path2[] = "bin/logDir/log.xxx"
            char* path = malloc(sizeof(path1) + sizeof(path2));
            strcpy(path, path1);
            strcat(path, path2);
            .

            free(path);
            exit(
            0);

            .
            原來最初寫這塊純C代碼的人打了馬虎眼,分配的內存有問題,導致free的時候出問題,但正常情況下,這里的exit之后,進程也就退出了,居然沒有core文件出來,導致這個Bug居然被隱藏了數年。

            libumem和LD_PRELOAD居然把它挖了出來,馬上修改之。

            所謂“禍患常積于忽微”,最不起眼的地方,往往會衍生一些麻煩,不時咬你一口。
            討厭的"legacy code without evolution/refactoring/test......",每個負責任的職業程序員都應該去深思

            【注】Linux上似乎也有libumem.so,但是卻沒有pstack/mdb這些好用的工具,只有valgrind/gdb了;solaris上不但有mdb/dtrace,還有dbx,雖然gdb也是可用的

            posted on 2009-06-30 22:05 skyscribe 閱讀(1574) 評論(0)  編輯 收藏 引用 所屬分類: Linux

            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲人成无码网站久久99热国产 | 久久久久亚洲AV成人网人人网站| 久久99毛片免费观看不卡 | 99精品久久精品| 一本伊大人香蕉久久网手机| 久久香蕉国产线看观看猫咪?v| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久中文字幕人妻丝袜| 久久久精品人妻一区二区三区四| 999久久久国产精品| 久久亚洲精品无码VA大香大香| 国产成人久久精品一区二区三区| 久久久精品久久久久久| 久久久精品人妻一区二区三区蜜桃 | 亚洲色欲久久久综合网东京热 | 国产视频久久| 久久综合香蕉国产蜜臀AV| 国产精品欧美久久久久天天影视 | 国产亚洲精品自在久久| 亚洲国产精品嫩草影院久久| 精品久久香蕉国产线看观看亚洲| 无码任你躁久久久久久久| 久久精品国产精品青草app| 久久久国产精华液| 人妻中文久久久久| 99久久99这里只有免费费精品| 国内精品伊人久久久久777| 亚洲国产成人精品女人久久久 | 久久久久久国产精品无码超碰| 免费久久人人爽人人爽av| 亚洲成av人片不卡无码久久| 91精品观看91久久久久久| 久久综合久久综合九色| 99久久无色码中文字幕| 亚洲国产欧洲综合997久久| 久久午夜夜伦鲁鲁片免费无码影视 | 久久这里只有精品18| 久久精品国产99国产精品亚洲| 四虎亚洲国产成人久久精品| 亚洲精品无码久久久| 亚洲国产小视频精品久久久三级|