当我意识到发布版本中的可执行文件是使用-g标志编译时,我正在调试用C ++ for Linux创建的应用程序。
我担心的是是否可以使用list或backtrace通过gdb读取可执行文件的源代码(利用一些已知的核心转储或antoher方法)
答案 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?