看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 4.8.2 問題(Question): 請問如果捕捉到 signal 和 exception, 如何在 runtime 知道 source level 引發 的行數(自動知道)。 舉例: 在 source code 第 567 行, 假設有一行自己的 source code 寫著 *((char *)123) = 0; 然後假設引發了signal由我自己寫的內部 function 捕捉到 我的內部 function 如何知道行數資訊也就是 567 這個數字並記錄起來呢? C++ exception 相同。 我只想到一些直覺的間接替代方案而已, 希望各位高手不吝指教阿!感激不盡~~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.110.244.218
diabloevagto:assert, __LINE__ 11/23 10:08
applecool:此路不通 11/23 13:17
yvb:backtrace() ? 11/23 14:52
applecool:阿!!!大概就是這個,我研究看看~~~感恩啊 11/23 17:31
yvb:補充一下, backtrace() 只是 addresses, 11/23 17:35
applecool:沒關係,有address 已經很好用了,我只擔心兩件事而已 11/23 17:37
yvb:搭配編譯 -rdynamic 和 backtrace_symbols() 可印 func+offset 11/23 17:37
applecool:因為我不想 symbol 外漏,所以不會加上那選項 11/23 17:38
applecool:可是這樣會不會讓原本藏得起來的部分 symbol 外漏??? 11/23 17:38
yvb:而搭配編譯 -g 及 addr2line 程式, 可印出 source 行號等. 11/23 17:39
applecool:因為我要把訊息 bt 的結果印出來 11/23 17:39
applecool:但是無論如何都不想有 symbol 被看見 XD 11/23 17:39
applecool:感激不盡阿 11/23 17:39
yvb:release 出去的檔案 strip 過就可以了, 自己留 -g 的. 11/23 17:40
yvb:然後就不要用 -rdynamic backtrace_symbols() 的方式. 11/23 17:41
applecool:是阿可是我想要 release -g 的出去 11/23 17:42
applecool:不過看起來是不行了 一定不能有 -g 11/23 17:45
applecool:感謝感謝啊!!! 11/23 17:45
yvb:用 -g 的, 別人就可看到 symbols... 11/23 17:45
yvb:反正印出 addresses 就夠了, log 拿回來再用 addr2line, 11/23 17:46
applecool:嗯嗯沒錯啊~~ 請問 string nm 完之後沒有就保證 OK 了嗎 11/23 17:46
yvb:搭配自己 -g 未 strip 過的, 就可以看到行號等資訊了. 11/23 17:46
applecool:請問我可以單抓 address 不設 -g ??? 11/23 17:47
yvb:試試看 strings -a exe-file, 可能還是看得到一點東西, 11/23 17:49
applecool:那如果這招用完重要的 symbol 都不見了,就保證藏住了? 11/23 17:50
yvb:但又如何? 應該還好吧... 11/23 17:50
applecool:有人在意阿~ 11/23 17:52
yvb:如果是 exe, 自己的 func, var 等應該在 strip 後就不見了, 11/23 17:55
yvb:但叫用的 printf 等 lib 名稱總是會在的. 11/23 17:55
yvb:如果是 libxx.so, 那 export 出去的還是要看得到,不然就無法用 11/23 17:56
yvb:所以自己留 -g, 不要用-rdynamic, 而 rel 的要 strip 就對了. 11/23 17:57
applecool:恩恩這我了解 不過看起來backtrace一定要 -g 11/23 17:59
yvb:所以要有兩份, 一份自用有symbols(-g),一份給人用是strip過的. 11/23 18:06
applecool:但 strip 還能 call backtrace()? 11/23 18:10
yvb:當然可以, 因為 backtrace() 只是讀出 addresses 而已. 11/23 19:59
yvb:要看 source 的 file, func, line number 等, 11/23 19:59
yvb:則是用 addr2line 給 address 參數, 搭配未 strip過的執行檔, 11/23 20:01
yvb:(也就是你自留的執行檔, 不是給別人那份), 才可以印出來. 11/23 20:03
applecool:喔喔了解,感謝 11/23 21:07
applecool:所以您的意思就是我使用 backtrace 然後不加 -g 11/23 21:08
applecool:最後再 strip 這樣就能保護 symbol 11/23 21:08
applecool:然後我 call backtrace() 只會輸出 address 11/23 21:09
applecool:不會有 symbol 和 source code,請問我這樣的理解正確嗎 11/23 21:10
yvb:可加-g(留自己debug用). strip及後的描述都對(重點就是strip). 11/23 22:15
yvb:當然, 如果你開發工具及函式庫等都未變動的情況下,重編譯加-g 11/23 22:19
yvb:應該還是能編出一樣的東西; 但如果有所更動, 可能重編後, 11/23 22:20
yvb:位址和行數對應可能就改了,所以建議留一份code和-g的執行檔. 11/23 22:22
applecool:感謝感謝!!!所以加不加 -g 對於 backtrace() 的影響 11/24 11:48
applecool:在於加了 -g 會有 souce + line, 不加只有 address ??? 11/24 11:48
applecool:真的很抱歉問題很多 11/24 11:49
yvb:-g 是執行檔會包含 debug info, 讓你可以 debug 工具做些事. 11/24 23:30
yvb:但 backtrace() 一定只是抓出 addresses, 11/24 23:32
yvb:根據 addresses 和 debug info, debug 工具才能得知 src+line. 11/24 23:33
applecool:了解!十分感謝!!! 11/25 09:58
applecool:總之就是我不要加 -g 只要 backtrace() 11/25 09:59
applecool:就無須擔心 user 會看到 symbol 或 source 就是了???? 11/25 10:00
yvb:還是要 strip 過. 請自行用 strings 和 nm 確認. 11/26 00:12
applecool:感激~~ 12/07 15:37