gdb 可以查看所有源代码吗?
can gdb allow to see ALL source code?
当我意识到发布版本中的可执行文件是使用 -g 标志编译的时,我正在调试用 C++ 创建的 Linux 应用程序。
我担心是否可以使用列表或回溯(利用一些已知的核心转储或 antoher 方法)通过 gdb 读取可执行文件的源代码
不,源代码不包含在使用 -g
构建的二进制文件中,因此仅使用二进制文件将无法读取它。
他们可以阅读的内容包括:
- 变量和函数的名称
- 对于每个指令:源文件的完整路径、文件中的行和它所在的函数的名称
不,源代码不包含在可执行文件中,即使使用 -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
中去除调试信息并在 [= 之间添加一个 link 13=] 回到 foo
.
现在,作为开发人员,您可以通过加载包含调试数据的附加 foo.debug
文件来调试发布版本,而客户仅获得 foo
,因此看不到调试信息。
可以在此处找到有关创建拆分调试信息的更详细信息 How to generate gcc debug symbol outside the build target?
当我意识到发布版本中的可执行文件是使用 -g 标志编译的时,我正在调试用 C++ 创建的 Linux 应用程序。
我担心是否可以使用列表或回溯(利用一些已知的核心转储或 antoher 方法)通过 gdb 读取可执行文件的源代码
不,源代码不包含在使用 -g
构建的二进制文件中,因此仅使用二进制文件将无法读取它。
他们可以阅读的内容包括:
- 变量和函数的名称
- 对于每个指令:源文件的完整路径、文件中的行和它所在的函数的名称
不,源代码不包含在可执行文件中,即使使用 -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
中去除调试信息并在 [= 之间添加一个 link 13=] 回到 foo
.
现在,作为开发人员,您可以通过加载包含调试数据的附加 foo.debug
文件来调试发布版本,而客户仅获得 foo
,因此看不到调试信息。
可以在此处找到有关创建拆分调试信息的更详细信息 How to generate gcc debug symbol outside the build target?