發表文章

目前顯示的是 2017的文章

除錯技巧:在 Ubuntu 上找出第三方函式庫的程式碼

這篇藉由一個小例子說明如何使用 gdb, locate, apt-file, apt-get 找出問題原因。藉由取得第三方函式庫的程式碼,可以減少瞎猜的時間。 問題我發現某個程式會不預期的結束。但它不是 crash,沒有 core dump 可看。 用 gdb 找出怎麼結束的先用 gdb attach 程式,繼續操作。程式結束時 gdb 顯示是呼叫 exit() 結束的。 於是再執行一次,這次用 gdb 在 exit 設中斷點再繼續執行。取得的 backtrace 如下: #0 __GI_exit (...) at exit.c:104 #1 0x00007fdd27f60408 in _XDefaultError (...) at ../../src/XlibInt.c:1414 #2 0x00007fdd27f6054b in _XError (...) at ../../src/XlibInt.c:1463 #3 0x00007fdd27f5d5e7 in handle_error ...) at ../../src/xcb_io.c:213 #4 0x00007fdd27f5e687 in _XReply (...) at ../../src/xcb_io.c:699 #5 0x00007fdd27f45346 in XGetWindowProperty (...) at ../../src/GetProp.c:69 #6 0x00007fdd2825db30 in XmuClientWindow () from /usr/lib/x86_64-linux-gnu/libXmu.so.6 ... 看 backtrace 沒什麼頭緒,都是第三方函式庫的程式。照 XmuClientWindow() 的說明,它可能會失敗,但它不該直接呼叫 exit()。先找 XmuClientWindow 的原始碼,看看有什麼線索。 用 Ubuntu 的 package 系統找出原始碼首先用 apt-file 找出 libXmu.so.6 在那個套件 (第一次執行需先跑 apt-file update 更新索引): $ apt-file search /usr/lib/x86_64-linux-gnu/libXmu.so.6 libxmu6: /usr/lib…