当我意识到发行版中的可执行文件使用-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.debug
和foo
之间添加链接。现在,开发人员可以通过加载包含调试数据的其他
foo.debug
文件来调试发行版,而只给客户提供foo
,因此看不到调试信息。在How to generate gcc debug symbol outside the build target?上可以找到有关创建拆分调试信息的更详细的信息。
关于c++ - gdb可以查看所有源代码吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33781828/