[問題] gdb 印出 auto 成員函式回傳值

看板C_and_CPP作者 (一閃)時間3年前 (2020/10/17 11:20), 3年前編輯推噓16(1719)
留言27則, 3人參與, 3年前最新討論串1/1
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1602904834.A.69F.html

10/17 12:15, 3年前 , 1F

10/17 12:15, 3年前 , 2F
版本多少 ?
10/17 12:15, 2F

10/17 12:26, 3年前 , 3F
GDB 7.7.1 跟SO上這個好像是不同問題
10/17 12:26, 3F

10/17 13:21, 3年前 , 4F
感覺要用很髒的寫法印出來
10/17 13:21, 4F

10/17 13:21, 3年前 , 5F
按錯等補推
10/17 13:21, 5F

10/17 13:25, 3年前 , 6F

10/17 13:25, 3年前 , 7F
1.0
10/17 13:25, 7F
這串我也有爬到 但沒任何實質解答XD

10/17 13:35, 3年前 , 8F
可以用-O0編嗎 最不會有問題?
10/17 13:35, 8F
跟優化應該無關 至少我看有無 auto 生出來的程式段組語是一樣的

10/17 13:37, 3年前 , 9F

10/17 13:38, 3年前 , 10F
這是gdb evaluate function的過程
10/17 13:38, 10F

10/17 13:38, 3年前 , 11F
我大膽猜測問題在create new stack那邊
10/17 13:38, 11F

10/17 13:38, 3年前 , 12F
畢竟全域不在stack裡面
10/17 13:38, 12F

10/17 13:44, 3年前 , 13F
所以全域的沒問題
10/17 13:44, 13F
一開始跟你想的一樣是 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 嗎 不知道有沒有理解正確

10/17 15:33, 3年前 , 14F
好想知道為什麼喔
10/17 15:33, 14F

10/17 16:21, 3年前 , 15F
用print S::f1 卻可以有int
10/17 16:21, 15F

10/17 16:25, 3年前 , 16F
我今天有空幫你研究一下
10/17 16:25, 16F

10/17 16:45, 3年前 , 17F
我用template卻可以s.f1(123)=123
10/17 16:45, 17F
剛試了一下 S::f1 確實能出現 int ... template 如果不行的話這個問題應該早就很多人討論了XD 畢竟 auto 回傳型別在 C++14 才支援

10/17 17:23, 3年前 , 18F
11就有囉
10/17 17:23, 18F

10/17 17:26, 3年前 , 19F
只是要配合decltype
10/17 17:26, 19F

10/19 17:05, 3年前 , 20F
隨手試了一下,clang9編出來跑gdb是有推論出來的
10/19 17:05, 20F

10/19 17:19, 3年前 , 21F
clang9編出來debug info直接就填int囉
10/19 17:19, 21F

10/19 18:08, 3年前 , 22F
10/19 18:08, 22F

10/19 18:08, 3年前 , 23F
打錯
10/19 18:08, 23F
感謝 剛試了一下 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 應該就不會有問題了

10/20 10:20, 3年前 , 24F
跟我想的一樣
10/20 10:20, 24F

10/20 11:27, 3年前 , 25F
舊的版本可以試試看把回傳值改成volatile試試
10/20 11:27, 25F

10/20 11:27, 3年前 , 26F
剛剛想到的
10/20 11:27, 26F
一樣不行 添加 CV 看來只是多一層繞道而已 auto 終究未解析出來

10/20 15:18, 3年前 , 27F
抱歉
10/20 15:18, 27F
幹嘛道歉XD 還要感謝你一直推幫我高調 ※ 編輯: KaryuuIssen (140.112.30.51 臺灣), 10/21/2020 05:28:55
文章代碼(AID): #1VYcC2QV (C_and_CPP)