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

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

最佳答案

不,即使使用-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.debugfoo之间添加链接。

现在,开发人员可以通过加载包含调试数据的其他foo.debug文件来调试发行版,而只给客户提供foo,因此看不到调试信息。

How to generate gcc debug symbol outside the build target?上可以找到有关创建拆分调试信息的更详细的信息。

关于c++ - gdb可以查看所有源代码吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33781828/

10-12 12:35
查看更多