1. 程式人生 > >利用dmesg和addr2line來對(動態庫裡的)段錯誤進行除錯

利用dmesg和addr2line來對(動態庫裡的)段錯誤進行除錯

問題:

工作中,我們在varnish的基礎上,利用vmod機制,實現了一個可以定製策略,且策略可自動載入而不需重新啟動引擎的cache(平時,大家對varnish的利用,cache策略都定義在一個vcl配置檔案中,每次對策略進行修改,都需要重新啟動varnish,從而使得策略生效,且當部署在varnish後面的站點很多時,不方便對每站點的cache策略進行個性化的定製),這裡各種策略的控制以及載入都實現在一個vmod模組裡(libvmod_ngcache.so),很開心,產品上線了。那麼問題來,(挖掘機技術那家強?)當程式上到線上的時候,有時會出現各種bug,尤其是當程式崩潰了,而又沒有對相應的core dump資訊進行儲存的時候,怎麼定位問題出在程式的哪個位置就成為了一個難題

,這篇文章就以我們的cache為例項,來示例定位問題。

解決方法:

程式發生段錯誤時,提示資訊很少,在沒有儲存相應的core dump資訊的情況下,要對這類錯誤進行除錯尤為顯得捉襟見肘,幸運的是我們可以利用linux系統自帶的一些小工具來檢視段錯誤發生的各種資訊:

dmesg 可以在應用程式崩潰的時候,顯示核心中儲存的相關資訊:

[email protected]****:/home/l7# dmesg-T | grep varnishd

[Thu Dec  421:25:58 2014] varnishd[16470] general protection ip:7feb693443bbsp:7feb669ea1e0 error:0 in libvmod_ngcache.so.1.0.0[7feb69331000+52000]

有時候,通過檢視相應的核心日誌,也可以檢視到同樣的資訊:

[email protected]****:/home/l7# cat/var/log/kern.log

Dec  5 07:49:34 ****kernel: [17376990.017811] varnishd[16470] general protection ip:7feb693443bbsp:7feb669ea1e0 error:0 in libvmod_ngcache.so.1.0.0[7feb69331000+52000]

 

[email protected]****:/home/l7# dmesg| grep varnishd

[17376990.017811] varnishd[16470] general protectionip:7feb693443bb sp:7feb669ea1e0 error:0 inlibvmod_ngcache.so.1.0.0[7feb69331000+52000]

輸出資訊內容:段錯誤發生的時間([17376990.017811])、發生段錯誤的程式名稱[程序號](varnishd[16470])、引起段錯誤發生的指令指標地址(general protection ip:7feb693443bb)、引起段錯誤發生的堆疊指標地址(sp:7feb669ea1e0)、錯誤程式碼(error:0)、libvmod_ngcache.so.1.0.0[7feb69331000+52000](In the libfoo.so[NNNNNN+YYYY] part, the NNNNNN is where the librarywas loaded. Subtract this from theinstruction pointer (ip) and you'll getthe offset into the .so of the offendinginstruction. Then you can use objdump -DCgl libfoo.so andsearch for the instruction at that offset. You should easily be able to figureout which function it is from the asm labels.If the .so doesn't haveoptimizations you can also try using addr2line-e libfoo.so <offset>, 52000 = 0xcb20)。

因此,有動作:

(一):

ip:0x7feb693443bb -libvmod_ngcache.so.1.0.0[0x7feb69331000+YYYY] = 0x133bb

[email protected]****:/home/l7# objdump-DCgl /usr/local/lib/varnish/vmods/libvmod_ngcache.so | grep -C 10 133bb

   1339c: 0f b6 c2               movzbl%dl,%eax

   1339f: 48 8b 5c c1 08         mov    0x8(%rcx,%rax,8),%rbx

/var/lib/jenkins/workspace/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/varnish_vmod/libvmod-ngcache/src/sfksearch.c:864

   133a4: 48 85 db               test   %rbx,%rbx

   133a7: 74 1f                  je     133c8<KTrieSearch+0x1b8>

   133a9: 44 8b 6c 24 2c         mov    0x2c(%rsp),%r13d

   133ae: 4c 89 fd               mov    %r15,%rbp

   133b1: 0f 1f 80 00 00 00 00   nopl   0x0(%rax)

/var/lib/jenkins/workspace/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/varnish_vmod/libvmod-ngcache/src/sfksearch.c:868

   133b8: 0f b6 c2               movzbl%dl,%eax

   133bb: 39 03                  cmp    %eax,(%rbx)

   133bd: 74 71                  je     13430 <KTrieSearch+0x220>

/var/lib/jenkins/workspace/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/varnish_vmod/libvmod-ngcache/src/sfksearch.c:895

   133bf: 48 8b 5b 08            mov    0x8(%rbx),%rbx

   133c3: 48 85 db               test   %rbx,%rbx

   133c6: 75 f0                  jne    133b8<KTrieSearch+0x1a8>

KTrieSearchNoBC():

/var/lib/jenkins/workspace/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/varnish_vmod/libvmod-ngcache/src/sfksearch.c:979

   133c8: 44 01 74 24 30         add    %r14d,0x30(%rsp)

/var/lib/jenkins/workspace/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/varnish_vmod/libvmod-ngcache/src/sfksearch.c:977

   133cd: 49 83 c7 01            add    $0x1,%r15

這裡基本上可以定位到出問題的函數了。

(二):

ip:0x7feb693443bb -libvmod_ngcache.so.1.0.0[0x7feb69331000+YYYY] = 0x133bb

[email protected]****:/home/l7# addr2line-e /usr/local/lib/varnish/vmods/libvmod_ngcache.so 0x133bb -f

KTriePrefixMatch

/var/lib/jenkins/workspace/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/l7cache_ngcache_vmod_for_varnish3.0.5_First_Edition/varnish_vmod/libvmod-ngcache/src/sfksearch.c:868

(三):

ip:0x7feb693443bb -libvmod_ngcache.so.1.0.0[0x7feb69331000+YYYY] = 0x133bb

[email protected]****:/home/l7# gdb/usr/local/lib/varnish/vmods/libvmod_ngcache.so

......

(gdb) disass0x133bb

......

  0x0000000000013399 <+393>:    xor    %r14d,%r14d

  0x000000000001339c <+396>:    movzbl%dl,%eax

  0x000000000001339f <+399>:    mov    0x8(%rcx,%rax,8),%rbx

  0x00000000000133a4 <+404>:    test   %rbx,%rbx

  0x00000000000133a7 <+407>:    je     0x133c8 <KTrieSearch+440>

  0x00000000000133a9 <+409>:    mov    0x2c(%rsp),%r13d

  0x00000000000133ae <+414>:    mov    %r15,%rbp

  0x00000000000133b1 <+417>:    nopl   0x0(%rax)

  0x00000000000133b8 <+424>:    movzbl%dl,%eax

   0x00000000000133bb <+427>:   cmp   %eax,(%rbx)

  0x00000000000133bd <+429>:    je     0x13430 <KTrieSearch+544>

  0x00000000000133bf <+431>:    mov    0x8(%rbx),%rbx

  0x00000000000133c3 <+435>:    test   %rbx,%rbx

  0x00000000000133c6 <+438>:    jne    0x133b8 <KTrieSearch+424>

另:推薦一些工具,供大家學習使用:

gdb、ldd、eu-readelf、readelf、objdump、dmesg、addr2line、nm、catchsegv;

另外建議,像這種線上的程式,儘量配置當程式crash的時候有coredump檔案產生或者記錄stack backtrace。

問題的查詢,參考了網路上很多的文章和Q&A,在這裡表示感謝並列出原文引用,謝謝!

Refer:

1、"Linux環境下段錯誤的產生原因及除錯方法小結"

2、"How doyou read a segfault kernel log message"

3、"DebuggingC++ (Part 3): dmesg"

4、"Introductionto segmentation fault handling"

5、"Pythoncrashed; how to decode segfault in dmesg log?"

http://stackoverflow.com/questions/21269999/python-crashed-how-to-decode-segfault-in-dmesg-log

相關推薦

利用dmesgaddr2line動態錯誤進行除錯

問題: 工作中,我們在varnish的基礎上,利用vmod機制,實現了一個可以定製策略,且策略可自動載入而不需重新啟動引擎的cache(平時,大家對varnish的利用,cache策略都定義在一個vcl配置檔案中,每次對策略進行修改,都需要重新啟動varnish,從而使得策

Qt一個Debug的專案,呼叫一個Release的動態,出現錯誤

 你們有沒有出現過這樣的問題: 一個動態庫,一個呼叫這個動態庫的專案,都是用Qt編寫的。但是這樣的情況會執行段錯誤:動態庫release版,呼叫者Debug版   答:  肯定報錯啊 

利用htmlunitjsoup實現爬取js的動態網頁實踐(執行js)

更新,這就尷尬了,這篇文章部落格閱讀文章最多,但是被踩得也最多。 爬取思路: 所謂動態,就是通過請求後臺,可以動態的改變相應的html頁面,頁面並不是一開始就全部展現出來的。 大部分操作都是通過請求完成的,一次請求,一次返回。而在大多數網頁中請求往往都被開發者隱藏在了js程

python 類實例動態添加方法

sta body elf import cme sel odt ssm gpo 1 class Person(): 2 def __init__(self, name): 3 self.name = name 4 5 6 def p

[C#]使用Redis存儲鍵值Key-Value Pair

all style lease scons ice 包管理 列表 有序集合 全部 本文為原創文章、源代碼為原創代碼,如轉載/復制,請在網頁/代碼處明顯位置標明原文名稱、作者及網址,謝謝! 開發工具:VS2017 語言:C# DotNet版本:.Net

轉載利用SIFTRANSAC算法openCV框架實現物體的檢測與定位,並求出變換矩陣findFundamentalMatfindHomography的比較 置頂

bsp 解釋 邊界 返回值 class 不同的 rip 很多 per 原文鏈接:https://blog.csdn.net/qq_25352981/article/details/46914837#commentsedit 本文目標是通過使用SIFT和RANSAC算

Android簽名文件轉化為pk8pemapk重簽名

cer ava key 用法 重簽名 pen 打開 ckey 就是 當我們需要修改已經打包好的apk中的某個文件時,比如改下圖標,我們勢必要采用反編譯apk,改文件,重編譯apk,重簽名才行,參考:https://www.cnblogs.com/zndxall/p

利用java編寫thriftinception模型進行訪問與部署

thrift就是一個跨語言呼叫的軟體框架。 首先運用thrift生成一個客戶端與服務端檔案,  客戶端:就是設定ip地址等資訊,並呼叫服務端資訊。 import cn.thrift.Tensorflow_Service; import org.apache.thrift.TEx

ThinkPHP5.0下,利用CookieSession儲存使用者資訊

利用tp5框架封裝好的Cookie類和Session類。若發現過期時間沒有生效,可以試試清除快取。 登入頁面Login.php <?php/** * Created by PhpStorm. * User: zjl * Date: 2018/11/1 * Time: 15:21 */namespac

ThinkPHP5.0下,利用CookieSession存儲用戶信息

gin rect 開啟 cookie con _id session func Nid 利用tp5框架封裝好的Cookie類和Session類。若發現過期時間沒有生效,可以試試清除緩存。 登錄頁面Login.php <?php/** * Created by PhpS

Spark SQL中使用StringIndexerIndexToString字串資訊進行索引反索引

簡介 本篇部落格使用Kaggle上的AdultBase資料集:Machine-Learning-Databases 此資料集雖然歷史比較悠久,但是資料格式比較容易處理,而且資訊比較全面,適合資料處理入門。 本篇部落格使用了Spark SQL的相關語句,實現了以下

Java8新特性 利用Lambda表示式List集合進行處理

Lambda表示式處理List 最近在做專案的過程中經常會接觸到 lambda 表示式,隨後發現它基本上可以替代所有 for 迴圈,包括增強for迴圈。也就是我認為,絕大部分的for迴圈都可以用 lambda 表示式改寫。 lambda表示式有它自己的優點:(1)簡潔,(2)易平行計算。尤其適用於遍歷結果

利用Lucene XPDF 處理pdf檔案

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

EXCEL 中利用 INDEX match 實現多條件查詢

1: 先建立一個sheet: 2: 測試:有兩個人叫同一個“胡天”,只是來自不同的省份: 先測試一下match: MATCH(A24&B24,A2:A16&B2:B16,0) 注意是 要 ctrl + shift + enter 一起按下去,才生效。看到

【轉】C++動態繫結虛擬函式表vtable 動態實現原理

 關於C++內部如何實現多型,對程式設計師來說即使不知道也沒關係,但是如果你想加深對多型的理解,寫出優秀的程式碼,那麼這一節就具有重要的意義。 我們知道,函式呼叫實際上是執行函式體中的程式碼。函式體是記憶體中的一個程式碼段,函式名就表示該程式碼段的首地址,函式執行時就從這裡開始。說得簡單

LeetCode -- Triangle 路徑求最小 動態規劃問題

Given a triangle, find the minimum path sum from top to bottom.  Each step you may move to adjacent numbers on the row below. For example, given the foll

利用閃回功能恢復刪除drop,delete的資料表及資料,update之後資料恢復

一、drop表 從 flashback table 裡查詢被刪除的資料表 1、select * from recyclebin order by droptime desc 2、執行表的恢復flashback table '需要恢復的表名' to before drop

利用keepalivetimeout判斷死連線

問題是這樣出現的,        操作:客戶端正在向服務端請求資料的時候,突然拔掉客戶端的網線。        現象:客戶端死等,服務端socket一直存在。 在網上搜索後,需要設定KEEPALIVE屬性。 於是就在客戶端和服務端都設定了KEEPALIVE屬性。 程式碼

移植U-BOOT之裁剪修改預設引數易用性啟動核心,以及uboot進行分割槽

今天我們來裁剪U-BOOT,使其更加易用,修改預設引數,以及製作最終修改好得補丁檔案方便以後的快速移植。 那麼如果想看之前的關於網絡卡以及flash等的移植,請點選連結檢視:點選連結檢視 在裁剪修改之前呢,我們先來了解一下U-BOOT的環境引數(環境變數):

利用HttpModuleResponseFilter壓縮你的html

 不知道大家有沒有注意過google和baidu首頁頁面的html,開啟一看你會發現,竟然沒有縮排什麼,幾乎整個頁面輸出都快寫成一行了,至於為什麼這樣做,我能想到的是節省流量,沒別的想法了.那我們是不是也可以做到這樣呢(雖然我們對流量沒什麼要求),當然是可以的,寫程式碼的時候