原文在
這里Backtrace中,一般都只有一些地址。但是利用addr2line這個(gè)工具,就可以找到對(duì)應(yīng)的代碼行。前提條件是可執(zhí)行程序或者動(dòng)態(tài)鏈接庫(kù)編譯的時(shí)候帶-g選項(xiàng)。
具體來(lái)說(shuō),分兩種情況:
- 如果關(guān)注的一行backtrace位于一個(gè)可執(zhí)行文件中,那么直接addr2line -e <executable> <address>
- 如果關(guān)注的backtrace位于一個(gè)動(dòng)態(tài)鏈接庫(kù)中,那么麻煩一些,因?yàn)閯?dòng)態(tài)鏈接庫(kù)的基地址不是固定的。這個(gè)時(shí)候,首先要把進(jìn)程的memory map找來(lái)。在Linux下,進(jìn)程的memory map可以在/proc/<pid>/maps文件中得到。然后在這個(gè)文件中找到動(dòng)態(tài)鏈接庫(kù)的基地址,然后將backtrace中的地址 - 動(dòng)態(tài)鏈接庫(kù)的基地址,得到偏移地址offset address, 最后addr2line -e <shared library> <offset address>。
當(dāng)然,用GDB也可以找出地址對(duì)應(yīng)的代碼行。不過(guò)相比addr2line,GDB需要將BUG現(xiàn)象重現(xiàn)一遍,所以對(duì)于不好重現(xiàn)的BUG,或是隨機(jī)重 現(xiàn)的BUG來(lái)說(shuō),使用addr2line就可以直接從backtrace找到對(duì)應(yīng)的代碼行,不需要重現(xiàn)現(xiàn)象,比GDB使用起來(lái)更簡(jiǎn)單。