使用gdb遇到问号调试代码

时间:2016-11-14 06:48:11

标签: go gdb

我在这里阅读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优化是否引起了问号?或者究竟是什么导致了这样的问号?

还有一个问题,如何检索问号背后隐藏的信息?

1 个答案:

答案 0 :(得分:0)

代码可能已经剥离了调试符号:

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 ?? ()

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