C_and_CPP 板


LINE

開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 問題(Question): 最近除錯時發現 gdb 好像無法解析 auto 的類別成員函式回傳值 一律只會印出 void 而且有確定該函式沒被優化掉 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) 簡單例子如下: #include <cstdio> struct S { auto f1(int v) { return v; } int f2(int v) { return v; } }; auto f3(int v) { return v; } int main() { S s; printf("%d %d %d\n", s.f1(1), s.f2(1), f3(1)); // 1 1 1 } 使用 gdb 印出如下: (gdb) p s.f1(1) $1 = void (gdb) p s.f2(1) $2 = 1 (gdb) p f3(1) $3 = 1 從結果看來一般函式 f3() 用 auto 回傳就沒這個問題 有人知道原因嗎? --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.30.51 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1602904834.A.69F.html
1F:推 ucrxzero: https://i.imgur.com/H7CzftL.png 10/17 12:15
2F:→ ucrxzero: 版本多少 ? 10/17 12:15
3F:→ KaryuuIssen: GDB 7.7.1 跟SO上這個好像是不同問題 10/17 12:26
4F:噓 ucrxzero: 感覺要用很髒的寫法印出來 10/17 13:21
5F:→ ucrxzero: 按錯等補推 10/17 13:21
7F:→ ucrxzero: 1.0 10/17 13:25
這串我也有爬到 但沒任何實質解答XD
8F:推 ucrxzero: 可以用-O0編嗎 最不會有問題? 10/17 13:35
跟優化應該無關 至少我看有無 auto 生出來的程式段組語是一樣的
9F:推 ucrxzero: https://i.imgur.com/E8qFr2J.png 10/17 13:37
10F:→ ucrxzero: 這是gdb evaluate function的過程 10/17 13:38
11F:→ ucrxzero: 我大膽猜測問題在create new stack那邊 10/17 13:38
12F:→ ucrxzero: 畢竟全域不在stack裡面 10/17 13:38
13F:推 ucrxzero: 所以全域的沒問題 10/17 13:44
一開始跟你想的一樣是 gdb 的問題 但剛剛我突然想到 看了一下 f1() 和 f3() 的 .debug_info 段發現: f1() ------------------------------------------------------------------------------ <2><672>: Abbrev Number: 26 (DW_TAG_subprogram) <673> DW_AT_external : 1 <673> DW_AT_name : f1 <676> DW_AT_decl_file : 1 <677> DW_AT_decl_line : 19 <678> DW_AT_linkage_name: (indirect string, offset: 0x249): _ZN1S2f1Ei <67c> DW_AT_type : <0x6b1> <680> DW_AT_declaration : 1 <680> DW_AT_object_pointer: <0x688> <684> DW_AT_sibling : <0x693> ... <1><6b1>: Abbrev Number: 29 (DW_TAG_unspecified_type) <6b2> DW_AT_name : (indirect string, offset: 0x106): auto f3() ------------------------------------------------------------------------------ <1><5e>: Abbrev Number: 4 (DW_TAG_base_type) <5f> DW_AT_byte_size : 4 <60> DW_AT_encoding : 5 (signed) <61> DW_AT_name : int ... <1><735>: Abbrev Number: 34 (DW_TAG_subprogram) <736> DW_AT_external : 1 <736> DW_AT_name : f3 <739> DW_AT_decl_file : 1 <73a> DW_AT_decl_line : 24 <73b> DW_AT_linkage_name: (indirect string, offset: 0xf9): _Z2f3i <73f> DW_AT_type : <0x5e> <743> DW_AT_low_pc : 0x400536 <74b> DW_AT_high_pc : 0xc <753> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa) <755> DW_AT_GNU_all_call_sites: 1 <755> DW_AT_sibling : <0x766> 我把重點上色了 同樣都是 auto f1() 卻無從推導出是回傳 int? 看來是 DWARF 生成的問題? 所以 gdb 無法解讀只能回傳 void 嗎 不知道有沒有理解正確
14F:推 ucrxzero: 好想知道為什麼喔 10/17 15:33
15F:推 ucrxzero: 用print S::f1 卻可以有int 10/17 16:21
16F:推 ucrxzero: 我今天有空幫你研究一下 10/17 16:25
17F:推 ucrxzero: 我用template卻可以s.f1(123)=123 10/17 16:45
剛試了一下 S::f1 確實能出現 int ... template 如果不行的話這個問題應該早就很多人討論了XD 畢竟 auto 回傳型別在 C++14 才支援
18F:推 ucrxzero: 11就有囉 10/17 17:23
19F:推 ucrxzero: 只是要配合decltype 10/17 17:26
20F:推 a1u1usul3: 隨手試了一下,clang9編出來跑gdb是有推論出來的 10/19 17:05
21F:推 a1u1usul3: clang9編出來debug info直接就填int囉 10/19 17:19
22F:推 ucrxzero: 乾 10/19 18:08
23F:→ ucrxzero: 打錯 10/19 18:08
感謝 剛試了一下 clang 真的OK了 看來就是 gcc 的 DWARF 生成的問題... 本來想說要去回報 gcc bug 的 發現原來幾年前已經有人回報過 只是遲遲未處理: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78329 直到半年前又有相同的回報: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94459 這次就有處理了 已經修掉的樣子 之後新版的 gcc 應該就不會有問題了
24F:推 ucrxzero: 跟我想的一樣 10/20 10:20
25F:推 ucrxzero: 舊的版本可以試試看把回傳值改成volatile試試 10/20 11:27
26F:→ ucrxzero: 剛剛想到的 10/20 11:27
一樣不行 添加 CV 看來只是多一層繞道而已 auto 終究未解析出來
27F:推 ucrxzero: 抱歉 10/20 15:18
幹嘛道歉XD 還要感謝你一直推幫我高調 ※ 編輯: KaryuuIssen (140.112.30.51 臺灣), 10/21/2020 05:28:55







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP