coredump 堆棧被寫壞問題定位
獨家號 ftom 作者 ftom原文鏈接
問題描述
游戲后台有一個導號工具,主要是把外網玩家賬號數據導入到內部環境供調試使用。 但是在導到有家族的賬號的時候,腳本會core掉並且退出。 腳本運行是每次請求的時候拉起,執行完畢之后釋放資源,無法在線進行gdb attach 上去斷點看問題。
查問題第一步當然是盡可能的收集遇到的問題。 查看coredump 文件,bt堆棧如下所示:發生了Segment Fault 段錯誤,但是函數堆棧被寫壞了 沒有進一步可以幫助到的信息。
不過方法總比問題多。 我們可以在編譯新的可執行文件時開啟以下gcc 編譯選項
-
-fstack-protector-all (https://www.ibm.com/developerworks/cn/linux/l-cn-gccstack/index.html) 該選項旨在通過Canaries檢測來判斷棧是否被破壞,在破壞前讓程序拋異常退出。 當然還有另外一個目的是提高棧溢出攻擊的成本。有興趣的可以了解下原理。通過這種方式來進行堆棧保護
- -g 加上g選項后編譯器會做如下額外操作
- 創建符號表,生成的文件包含符號表內容。生成的core文件也會附帶符號表相關內容
- 關閉優化機制,程序嚴格按照原來的代碼執行,避免定位問題對應代碼帶來的偏移干擾
- 開啟-O0 選項避免參數和函數inline。 生產環境建議開啟為-O2 。這里為了方便定位問題,臨時調整成該選項。
執行完上述步驟之后,采用新的二進制文件執行,程序coredump文件堆棧 如下所示:
出現_stack_chk_fail 毫無疑問是棧空間被寫壞了。bt查看函數棧楨底部丟失,第#6函數楨丟失, 可以推斷是上一楨函數把自己的返回地址搞丟了。可以重點排查下SaveTbFamily上 申請的棧變量以及內存拷貝賦值相關的代碼
如果邏輯比較復雜,可以把該函數內申請的所有棧變量【主要是自定義類型】替換成堆變量。 再編一個版本出去,棧溢出可以肯定也能把對應的堆變量整溢出,堆溢出不至於把函數棧弄壞。
重新修改一個版本之后,重新執行獲取到的core文件如下:這里終於借助堆溢出把完整的函數棧打印出來了。 接下來的事情就是常規的coredump問題定位了。
當然上述步驟僅限於在內網操作,如果是現網,最好隔離出一台機子,放少量流量進來復現。 定位問題不以要影響現網服務為首要原則 目前僅遇到上述場景,有其他好的方法,歡迎交流
擴展閱讀:
GDB調試CoreDump出現??符號的解決方法
(2015-03-12 15:17:13)標簽: it教育模式 |
分類: linux |
今天遇到個問題,某人的代碼有斷錯誤,導致我的工作無法展開,抱怨的就不多說了,正好讓我解決了一個gdb的操作問題!
現在說下gdb+coredump的調試流程
在實機上先打開產生core文件的設置,ulimit -c unlimited ,這將使程序在遇到斷錯誤的時候保留下當時的堆棧信息,而這個core文件的大小沒有進行限制,當然,還可以更改core文件的產生路徑,具體可以google下。 之后運行斷錯誤程序,獲取產生的core文件。
運用平台指定的gdb程序 調用arm-linux-gdb -c core
bt下
這時會看到#0 0x2ae1cc9e in ?? ()之類的堆棧信息,因為沒有指定帶調試信息的調試程序,所以無法讀書函數的符號表,所以顯示不出當時的堆棧運行到那個函數。
輸入file exec ,顯示出Reading symbols from /media/disk/work/ngi/work_space/ngi/out/target/product/high/system/usr/bin/testmode...done
說明加載進了符號表,在bt下就應該能看到堆棧的函數名了
(gdb) bt
#0 0x2ae1cc9e in ?? ()
#1 0x2ac02600 in ?? ()
#2 0x2ac02600 in ?? ()
事實是否如我猜測呢?
輸入info share
(gdb) info share
warning: .dynamic section for "/media/disk/work/ngi/work_space/ngi/prebuilts/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib/libm.so.6" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/media/disk/work/ngi/work_space/ngi/prebuilts/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib/libc.so.6" is not at the expected address (wrong library or version mismatch?)
warning: Could not load shared library symbols for 60 libraries, e.g. /lib/libncore.so.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
From To Syms Read Shared Object Library
No /lib/libncore.so
No /lib/libicuuc.so
No /lib/liblog.so
No /lib/libncutility.so
No /lib/libncplatform.so
No /lib/libncdevice.so
No /lib/libnhcommon.so
No /lib/libnhdiag.so
No /lib/libnhucom.so
No /lib/libnhkey.so
No /lib/libnhsysctrl.so
No /lib/libzeromq.so
No /lib/libbinder.so
No /lib/libnceventsys.so
No /usr/lib/libncgstreamer.so
No /lib/libGLESv1_CM.so
No /lib/libEGL.so
No /lib/libGAL.so
No /usr/lib/libncgraphics.so
No /usr/lib/libGraphicsCore.so
No /usr/lib/liboverlay.so
No /usr/lib/libtuner.so
No /usr/lib/libsourceusbapi.so
No /usr/lib/libsourceusb.so
No /usr/lib/libnhbtproxy.so
No /usr/lib/libgmock.so
No /lib/libncstorage.so
No /lib/libnhvehicle.so
No /lib/libnhcanbus.so
0x2ae83e80 0x2ae91fdc No /media/disk/work/ngi/work_space/ngi/prebuilts/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib/libpthread.so.0
0x2adb56a0 0x2adb8e58 No /media/disk/work/ngi/work_space/ngi/prebuilts/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib/librt.so.1
0x2adc38fc 0x2adc4614 No /media/disk/work/ngi/work_space/ngi/prebuilts/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib/libdl.so.2
No /lib/libstdc++.so.6
0x2b0f61a8 0x2b15a9b8 No /media/disk/work/ngi/work_space/ngi/prebuilts/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib/libm.so.6
No /lib/libgcc_s.so.1
0x2b179440 0x2b262044 No /media/disk/work/ngi/work_space/ngi/prebuilts/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib/libc.so.6
0x2aaef780 0x2ab07a20 No /media/disk/work/ngi/work_space/ngi/prebuilts/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/lib/ld-linux.so.3
No /lib/libutils.so
可以看到很多庫的符號表都沒有被讀入,看來果然如此。
輸入用set solib-search-path + 庫的路徑 指定所要讀取的符號表動態庫所在位置,結果會看到很多done之類的信息,說明加載成功,
現在bt下就能看到堆棧的詳細信息了。
(gdb) bt
#0 nutshell::SourceUSB_ScannerThread::setScannerState (this=0x0,
state=nutshell::SourceUSB_ScannerThread::SCANNERSTATE_START)
at system/MediaLibrary/SourceUSB/src/Thread_Scanner/SourceUSB_ScannerThread.cpp:138
#1 0x2ae1ce1a in nutshell::SourceUSB_Scanner_EventHandler::onHandle (this=0xaf4a0, cEvt=...)
at system/MediaLibrary/SourceUSB/src/Thread_Scanner/SourceUSB_Scanner_EventHandler.cpp:50
#2 0x2ae17018 in nutshell::SourceUSB_EventHandlerBase::onHandle (this=, cEvt=)
at system/MediaLibrary/SourceUSB/src/include/base/SourceUSB_EventHandlerBase.h:35
#3 0x2abe85b6 in nutshell::PI_EventHandlerThreadImp::run (this=0xaef88)
at system/MediaLibrary/common/TsmThreadLib/src/PI_EventHandlerThreadImp.cpp:93
#4 0x2ac04e34 in ?? ()
#5 0x2ac04e34 in ?? ()
之后就是去告訴某人這個問題所在了
沒有core堆棧
https://www.cnblogs.com/onlyforcloud/p/3446483.html