[問題] 請問如何知道執行中的行數

看板C_and_CPP作者 (noOneKnows)時間12年前 (2013/11/23 09:16), 編輯推噓7(7051)
留言58則, 3人參與, 最新討論串1/1
開發平台(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

11/23 10:08, , 1F
assert, __LINE__
11/23 10:08, 1F

11/23 13:17, , 2F
此路不通
11/23 13:17, 2F

11/23 14:52, , 3F
backtrace() ?
11/23 14:52, 3F

11/23 17:31, , 4F
阿!!!大概就是這個,我研究看看~~~感恩啊
11/23 17:31, 4F

11/23 17:35, , 5F
補充一下, backtrace() 只是 addresses,
11/23 17:35, 5F

11/23 17:37, , 6F
沒關係,有address 已經很好用了,我只擔心兩件事而已
11/23 17:37, 6F

11/23 17:37, , 7F
搭配編譯 -rdynamic 和 backtrace_symbols() 可印 func+offset
11/23 17:37, 7F

11/23 17:38, , 8F
因為我不想 symbol 外漏,所以不會加上那選項
11/23 17:38, 8F

11/23 17:38, , 9F
可是這樣會不會讓原本藏得起來的部分 symbol 外漏???
11/23 17:38, 9F

11/23 17:39, , 10F
而搭配編譯 -g 及 addr2line 程式, 可印出 source 行號等.
11/23 17:39, 10F

11/23 17:39, , 11F
因為我要把訊息 bt 的結果印出來
11/23 17:39, 11F

11/23 17:39, , 12F
但是無論如何都不想有 symbol 被看見 XD
11/23 17:39, 12F

11/23 17:39, , 13F
感激不盡阿
11/23 17:39, 13F

11/23 17:40, , 14F
release 出去的檔案 strip 過就可以了, 自己留 -g 的.
11/23 17:40, 14F

11/23 17:41, , 15F
然後就不要用 -rdynamic backtrace_symbols() 的方式.
11/23 17:41, 15F

11/23 17:42, , 16F
是阿可是我想要 release -g 的出去
11/23 17:42, 16F

11/23 17:45, , 17F
不過看起來是不行了 一定不能有 -g
11/23 17:45, 17F

11/23 17:45, , 18F
感謝感謝啊!!!
11/23 17:45, 18F

11/23 17:45, , 19F
用 -g 的, 別人就可看到 symbols...
11/23 17:45, 19F

11/23 17:46, , 20F
反正印出 addresses 就夠了, log 拿回來再用 addr2line,
11/23 17:46, 20F

11/23 17:46, , 21F
嗯嗯沒錯啊~~ 請問 string nm 完之後沒有就保證 OK 了嗎
11/23 17:46, 21F

11/23 17:46, , 22F
搭配自己 -g 未 strip 過的, 就可以看到行號等資訊了.
11/23 17:46, 22F

11/23 17:47, , 23F
請問我可以單抓 address 不設 -g ???
11/23 17:47, 23F

11/23 17:49, , 24F
試試看 strings -a exe-file, 可能還是看得到一點東西,
11/23 17:49, 24F

11/23 17:50, , 25F
那如果這招用完重要的 symbol 都不見了,就保證藏住了?
11/23 17:50, 25F

11/23 17:50, , 26F
但又如何? 應該還好吧...
11/23 17:50, 26F

11/23 17:52, , 27F
有人在意阿~
11/23 17:52, 27F

11/23 17:55, , 28F
如果是 exe, 自己的 func, var 等應該在 strip 後就不見了,
11/23 17:55, 28F

11/23 17:55, , 29F
但叫用的 printf 等 lib 名稱總是會在的.
11/23 17:55, 29F

11/23 17:56, , 30F
如果是 libxx.so, 那 export 出去的還是要看得到,不然就無法用
11/23 17:56, 30F

11/23 17:57, , 31F
所以自己留 -g, 不要用-rdynamic, 而 rel 的要 strip 就對了.
11/23 17:57, 31F

11/23 17:59, , 32F
恩恩這我了解 不過看起來backtrace一定要 -g
11/23 17:59, 32F

11/23 18:06, , 33F
所以要有兩份, 一份自用有symbols(-g),一份給人用是strip過的.
11/23 18:06, 33F

11/23 18:10, , 34F
但 strip 還能 call backtrace()?
11/23 18:10, 34F

11/23 19:59, , 35F
當然可以, 因為 backtrace() 只是讀出 addresses 而已.
11/23 19:59, 35F

11/23 19:59, , 36F
要看 source 的 file, func, line number 等,
11/23 19:59, 36F

11/23 20:01, , 37F
則是用 addr2line 給 address 參數, 搭配未 strip過的執行檔,
11/23 20:01, 37F

11/23 20:03, , 38F
(也就是你自留的執行檔, 不是給別人那份), 才可以印出來.
11/23 20:03, 38F

11/23 21:07, , 39F
喔喔了解,感謝
11/23 21:07, 39F

11/23 21:08, , 40F
所以您的意思就是我使用 backtrace 然後不加 -g
11/23 21:08, 40F

11/23 21:08, , 41F
最後再 strip 這樣就能保護 symbol
11/23 21:08, 41F

11/23 21:09, , 42F
然後我 call backtrace() 只會輸出 address
11/23 21:09, 42F

11/23 21:10, , 43F
不會有 symbol 和 source code,請問我這樣的理解正確嗎
11/23 21:10, 43F

11/23 22:15, , 44F
可加-g(留自己debug用). strip及後的描述都對(重點就是strip).
11/23 22:15, 44F

11/23 22:19, , 45F
當然, 如果你開發工具及函式庫等都未變動的情況下,重編譯加-g
11/23 22:19, 45F

11/23 22:20, , 46F
應該還是能編出一樣的東西; 但如果有所更動, 可能重編後,
11/23 22:20, 46F

11/23 22:22, , 47F
位址和行數對應可能就改了,所以建議留一份code和-g的執行檔.
11/23 22:22, 47F

11/24 11:48, , 48F
感謝感謝!!!所以加不加 -g 對於 backtrace() 的影響
11/24 11:48, 48F

11/24 11:48, , 49F
在於加了 -g 會有 souce + line, 不加只有 address ???
11/24 11:48, 49F

11/24 11:49, , 50F
真的很抱歉問題很多
11/24 11:49, 50F

11/24 23:30, , 51F
-g 是執行檔會包含 debug info, 讓你可以 debug 工具做些事.
11/24 23:30, 51F

11/24 23:32, , 52F
但 backtrace() 一定只是抓出 addresses,
11/24 23:32, 52F

11/24 23:33, , 53F
根據 addresses 和 debug info, debug 工具才能得知 src+line.
11/24 23:33, 53F

11/25 09:58, , 54F
了解!十分感謝!!!
11/25 09:58, 54F

11/25 09:59, , 55F
總之就是我不要加 -g 只要 backtrace()
11/25 09:59, 55F

11/25 10:00, , 56F
就無須擔心 user 會看到 symbol 或 source 就是了????
11/25 10:00, 56F

11/26 00:12, , 57F
還是要 strip 過. 請自行用 strings 和 nm 確認.
11/26 00:12, 57F

12/07 15:37, , 58F
感激~~
12/07 15:37, 58F
文章代碼(AID): #1Ia07ry0 (C_and_CPP)