[問題] gdb 印出 auto 成員函式回傳值
開發平台(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, 1F
→
10/17 12:15,
3年前
, 2F
10/17 12:15, 2F
→
10/17 12:26,
3年前
, 3F
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, 6F
→
10/17 13:25,
3年前
, 7F
10/17 13:25, 7F
這串我也有爬到 但沒任何實質解答XD
推
10/17 13:35,
3年前
, 8F
10/17 13:35, 8F
跟優化應該無關 至少我看有無 auto 生出來的程式段組語是一樣的
推
10/17 13:37,
3年前
, 9F
10/17 13:37, 9F
→
10/17 13:38,
3年前
, 10F
10/17 13:38, 10F
→
10/17 13:38,
3年前
, 11F
10/17 13:38, 11F
→
10/17 13:38,
3年前
, 12F
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
10/17 16:21, 15F
推
10/17 16:25,
3年前
, 16F
10/17 16:25, 16F
推
10/17 16:45,
3年前
, 17F
10/17 16:45, 17F
剛試了一下 S::f1 確實能出現 int ...
template 如果不行的話這個問題應該早就很多人討論了XD
畢竟 auto 回傳型別在 C++14 才支援
推
10/17 17:23,
3年前
, 18F
10/17 17:23, 18F
推
10/17 17:26,
3年前
, 19F
10/17 17:26, 19F
推
10/19 17:05,
3年前
, 20F
10/19 17:05, 20F
推
10/19 17:19,
3年前
, 21F
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
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