C语言编程中的调试

C语言编程中的调试,c,debugging,gdb,C,Debugging,Gdb,我对调试方法还不熟悉,有很多事情我不理解 这里的主要问题是我想确认我的图像文件是否包含我的源代码,然后任何人都可以使用调试功能(如list命令)获取源代码。 调试用于图像文件,如exe扩展名 我在gdb中看到了一些命令,比如list命令 如果我能列出我所有的源代码,这是安全的,我的意思是调试器将能够看到我所有的代码 如果我的代码编译为发行版,list命令还能显示我的所有源代码吗 还有调试的好处是什么,我的意思是我可以使用测试单元测试、破坏性测试或其他什么 那么,为什么要进行调试呢。在我的软件被编

我对调试方法还不熟悉,有很多事情我不理解

这里的主要问题是我想确认我的图像文件是否包含我的源代码,然后任何人都可以使用调试功能(如list命令)获取源代码。 调试用于图像文件,如exe扩展名

我在gdb中看到了一些命令,比如list命令

如果我能列出我所有的源代码,这是安全的,我的意思是调试器将能够看到我所有的代码

如果我的代码编译为发行版,list命令还能显示我的所有源代码吗

还有调试的好处是什么,我的意思是我可以使用测试单元测试、破坏性测试或其他什么

那么,为什么要进行调试呢。在我的软件被编译之后,知道它的错误又有什么用呢

最后,我可以对源代码本身进行调试吗

简单地说,我想知道需要调试的核心


我相信这会得到很多反对票,但我不介意我是否能理解调试的核心需求。

首先,任何C应用程序都会编译成机器代码。这必须始终包含正确运行的程序逻辑。将机器代码反编译回原始源代码仍然很困难,因为在编译和链接阶段会丢失很多信息,如变量名等

为了让调试器提供有关变量名的所有必要信息,有时甚至是确切的源代码,必须在编译过程中的某个地方编写必要的信息。对于ELF可执行文件,默认情况下,在单独的ELF部分中以称为DWARF的格式编写。为此,必须使用-g选项gcc编译应用程序。使用像objcopy和strip这样的工具,您可以删除调试部分并将它们存储在单独的文件中,这是非常理想的

如果您的应用程序以核心文件的形式崩溃,这对于调试和报告出错情况非常有用,因此称为核心转储


删除调试信息提供了一些安全性,但不会阻止坚定的对手对源代码进行反向工程。

作者Eric Lippert对如何调试程序进行了很好的总结:你不明白为什么一步一步地检查一个复杂的东西的执行是有用的,这个复杂的东西几乎以光速运行,有几十亿种可能的状态?至于它是什么,好吧。。。这是一种找到并帮助修复的方法。去bug代码就是删除bug。了解如何调试代码,包括诸如rubber duck调试和实际使用调试器程序等不同技术,对于任何想成为程序员的人来说,这是至关重要的必要知识,即使是在爱好者级别。我的图像文件始终包含我的源代码?不,您的可执行程序通常不包含源代码,但可能有调试信息包含有关源位置的信息。在C标记中,您的第一句话是正确的。在其他标签Java、Python、Perl、C、Swift……中,它很容易被认为是不正确的。因为这是一个C问题,所以这不是一个问题,尽管“任何用C编写的应用程序”都可以避免使用此注释。虽然有或曾经有一些C解释器,但它们只是极少数,基本上可以忽略。我的答案的细节也针对使用ELF文件格式的Unix。但它被标记为GDB