【问题标题】:Debugging go code with gdb encountering question mark使用gdb调试go代码遇到问号
【发布时间】:2016-11-14 15:24:38
【问题描述】:

我在这里阅读了golang官方gdb文档https://golang.org/doc/gdb

我很好奇在检查堆栈时导致问号的原因。

(gdb) bt  # backtrace
#0  regexp.TestFind (t=0xf8404a89c0) at /home/user/go/src/regexp/find_test.go:148
#1  0x000000000042f60b in testing.tRunner (t=0xf8404a89c0, test=0x573720) at /home/user/go/src/testing/testing.go:156
#2  0x000000000040df64 in runtime.initdone () at /home/user/go/src/runtime/proc.c:242
#3  0x000000f8404a89c0 in ?? ()
#4  0x0000000000573720 in ?? ()
#5  0x0000000000000000 in ?? ()

那么,gdb 优化是否引起了问号?或者到底是什么导致了这样的问号?

还有一个问题,如何找回隐藏在问号后面的消息?

【问题讨论】:

    标签: go gdb


    【解决方案1】:

    代码可能已经去掉了调试符号:

    gcc -s
    

    您可以通过这个简单的示例看到这种行为

    #include <stdio.h>
    
    void riskyCode() {
      char *error_str = "This code will fail with SIGSEGV";
      *error_str = 'g';
    }
    
    int c() {
      riskyCode();
      return 1;
    }
    
    int b() {
      return c();
    }
    
    int a() {
      return b();
    }
    
    int main() {
      return a();
    }
    

    这样编译

    gcc -s -O0 -o main main.c
    

    并在 gdb 中运行代码

    gdb main
    > run
    

    然后,你会看到??在堆栈位置

    bt
    #0  0x000000000040056a in ?? ()
    #1  0x000000000040057d in ?? ()
    #2  0x0000000000400592 in ?? ()
    #3  0x00000000004005a2 in ?? ()
    #4  0x00000000004005b2 in ?? ()
    #5  0x00002aaaaacebc36 in __libc_start_main () from /lib64/libc.so.6
    #6  0x0000000000400429 in ?? ()
    #7  0x00007fffffff93f8 in ?? ()
    #8  0x000000000000001c in ?? ()
    #9  0x0000000000000001 in ?? ()
    #10 0x00007fffffff9ca2 in ?? ()
    #11 0x0000000000000000 in ?? ()
    

    尝试使用相同的库,但使用调试符号编译?

    【讨论】:

    • 谢谢mko!可能是golang compile的优化结果出现了这样的问号。
    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2014-04-24
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多