可以gdb允许查看所有源代码吗?

时间:2015-11-18 13:52:09

标签: c++ gdb

当我意识到发布版本中的可执行文件是使用-g标志编译时,我正在调试用C ++ for Linux创建的应用程序。

我担心的是是否可以使用list或backtrace通过gdb读取可执行文件的源代码(利用一些已知的核心转储或antoher方法)

2 个答案:

答案 0 :(得分:0)

不,源代码不包含在使用-g构建的二进制文件中,因此仅使用二进制文件无法读取它。

他们可以阅读的内容包括:

  • 变量和函数的名称
  • 对于每个构造:源文件的完整路径,文件中的行和它所在的函数的名称

答案 1 :(得分:0)

不,即使使用-g进行编译,源代码也不会包含在可执行文件中。包含的内容是对源代码的引用,因此程序地址与文件和行号之间存在映射。

调试中还会有一些信息描述程序中的函数,因此会有描述每个函数的信息,所采用和返回的类型以及它包含的局部变量,还有关于哪些地址对应哪些地址的信息功能。所有类型和全局变量也将在调试信息中描述。

可以使用objcopy将调试信息从您的程序中分离出来,以下内容取自gdb在线手册(https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

objcopy --only-keep-debug foo foo.debug
strip -g foo
objcopy --add-gnu-debuglink=foo.debug foo

这会从foo中获取调试信息并将其放在foo.debug中,从foo中删除调试信息,并在foo.debug之间添加一个链接返回{ {1}}。

现在,由于开发人员可以通过加载包含调试数据的附加foo文件来调试发布版本,而客户只能获得foo.debug,因此看不到调试信息。

有关创建拆分调试信息的更详细信息,请参见How to generate gcc debug symbol outside the build target?