Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
2年前关闭。
我是调试方法的新手,有很多我不明白的事情。
这里的主要问题是我想确认我的图像文件是否包含我的源代码,那么任何人都可以使用调试功能(如list命令)获取源代码。
调试用于图像文件,例如exe扩展名
我在gdb中看到一些命令,例如“列表命令”
如果我可以列出我的所有源代码,那么这是安全的,那意味着调试器将能够看到我的所有代码。
如果我的代码编译为发行版,则list命令仍然能够显示我的所有源代码?
还有调试的好处是什么,我的意思是说我可以使用测试单元测试,销毁测试或其他方法。
那么为什么要完全调试。以及在我的软件已编译后知道其错误的用途是什么。
终于可以对源代码本身使用调试了吗?
简而言之,我想知道核心需要调试。
我敢肯定,这将获得很多反对,但是我不介意我是否可以理解调试的核心需求。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
2年前关闭。
我是调试方法的新手,有很多我不明白的事情。
这里的主要问题是我想确认我的图像文件是否包含我的源代码,那么任何人都可以使用调试功能(如list命令)获取源代码。
调试用于图像文件,例如exe扩展名
我在gdb中看到一些命令,例如“列表命令”
如果我可以列出我的所有源代码,那么这是安全的,那意味着调试器将能够看到我的所有代码。
如果我的代码编译为发行版,则list命令仍然能够显示我的所有源代码?
还有调试的好处是什么,我的意思是说我可以使用测试单元测试,销毁测试或其他方法。
那么为什么要完全调试。以及在我的软件已编译后知道其错误的用途是什么。
终于可以对源代码本身使用调试了吗?
简而言之,我想知道核心需要调试。
我敢肯定,这将获得很多反对,但是我不介意我是否可以理解调试的核心需求。
最佳答案
首先,任何C应用程序都将被编译为机器代码。它必须始终包含程序逻辑才能正确运行。由于在编译和链接阶段会丢失很多信息(如变量名等),因此仍然很难将机器代码反编译回原始源。
为了使调试器提供有关变量名称的所有必要信息,有时甚至提供确切的源代码,必须在编译过程中将必要的信息写在某处。对于ELF可执行文件,默认情况下,这是在单独的ELF部分中以称为DWARF的格式编写的。为此,您必须使用-g选项(gcc)编译应用程序。使用objcopy
和strip
之类的工具可以删除调试部分,并将它们存储在单独的文件中。
如果您的应用程序以core
文件的形式崩溃(因此称为核心转储)而崩溃,这对于调试和报告错误是很有用的。
删除调试信息可以提供一定的安全性,但不会阻止您对源代码进行反向工程。
关于c - 用C编程进行调试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49602101/