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

作者: KaryuuIssen (一閃)   2020-10-17 11:20:30
開發平台(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 回傳就沒這個問題
有人知道原因嗎?
作者: ucrxzero (RX-0)   2020-10-17 12:15:00
作者: KaryuuIssen (一閃)   2020-10-17 12:26:00
GDB 7.7.1 跟SO上這個好像是不同問題
作者: ucrxzero (RX-0)   2020-10-17 13:21:00
感覺要用很髒的寫法印出來按錯等補推https://community.slickedit.com/index.php?topic=8641.0可以用-O0編嗎 最不會有問題?https://i.imgur.com/E8qFr2J.png這是gdb evaluate function的過程我大膽猜測問題在create new stack那邊畢竟全域不在stack裡面所以全域的沒問題好想知道為什麼喔用print S::f1 卻可以有int我今天有空幫你研究一下我用template卻可以s.f1(123)=12311就有囉只是要配合decltype
作者: a1u1usul3 (Q-Max)   2020-10-19 17:05:00
隨手試了一下,clang9編出來跑gdb是有推論出來的clang9編出來debug info直接就填int囉
作者: ucrxzero (RX-0)   2020-10-19 18:08:00
乾打錯

Links booklink

Contact Us: admin [ a t ] ucptt.com