→ ucrxzero: 版本多少 ? 10/17 12:15
→ KaryuuIssen: GDB 7.7.1 跟SO上這個好像是不同問題 10/17 12:26
噓 ucrxzero: 感覺要用很髒的寫法印出來 10/17 13:21
→ ucrxzero: 按錯等補推 10/17 13:21
→ ucrxzero: 1.0 10/17 13:25
這串我也有爬到 但沒任何實質解答XD
推 ucrxzero: 可以用-O0編嗎 最不會有問題? 10/17 13:35
跟優化應該無關 至少我看有無 auto 生出來的程式段組語是一樣的
→ ucrxzero: 這是gdb evaluate function的過程 10/17 13:38
→ ucrxzero: 我大膽猜測問題在create new stack那邊 10/17 13:38
→ ucrxzero: 畢竟全域不在stack裡面 10/17 13:38
推 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 嗎
不知道有沒有理解正確
推 ucrxzero: 好想知道為什麼喔 10/17 15:33
推 ucrxzero: 用print S::f1 卻可以有int 10/17 16:21
推 ucrxzero: 我今天有空幫你研究一下 10/17 16:25
推 ucrxzero: 我用template卻可以s.f1(123)=123 10/17 16:45
剛試了一下 S::f1 確實能出現 int ...
template 如果不行的話這個問題應該早就很多人討論了XD
畢竟 auto 回傳型別在 C++14 才支援
推 ucrxzero: 11就有囉 10/17 17:23
推 ucrxzero: 只是要配合decltype 10/17 17:26
推 a1u1usul3: 隨手試了一下,clang9編出來跑gdb是有推論出來的 10/19 17:05
推 a1u1usul3: clang9編出來debug info直接就填int囉 10/19 17:19
推 ucrxzero: 乾 10/19 18:08
→ 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 應該就不會有問題了
推 ucrxzero: 跟我想的一樣 10/20 10:20
推 ucrxzero: 舊的版本可以試試看把回傳值改成volatile試試 10/20 11:27
→ ucrxzero: 剛剛想到的 10/20 11:27
一樣不行 添加 CV 看來只是多一層繞道而已
auto 終究未解析出來
推 ucrxzero: 抱歉 10/20 15:18
幹嘛道歉XD 還要感謝你一直推幫我高調
※ 編輯: KaryuuIssen (140.112.30.51 臺灣), 10/21/2020 05:28:55