Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        2年前关闭。
                                                                                            
                
        
我是调试方法的新手,有很多我不明白的事情。

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

调试用于图像文件,例如exe扩展名

我在gdb中看到一些命令,例如“列表命令”

如果我可以列出我的所有源代码,那么这是安全的,那意味着调试器将能够看到我的所有代码。

如果我的代码编译为发行版,则list命令仍然能够显示我的所有源代码?

还有调试的好处是什么,我的意思是说我可以使用测试单元测试,销毁测试或其他方法。

那么为什么要完全调试。以及在我的软件已编译后知道其错误的用途是什么。

终于可以对源代码本身使用调试了吗?

简而言之,我想知道核心需要调试。

我敢肯定,这将获得很多反对,但是我不介意我是否可以理解调试的核心需求。

最佳答案

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

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

如果您的应用程序以core文件的形式崩溃(因此称为核心转储)而崩溃,这对于调试和报告错误是很有用的。

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

关于c - 用C编程进行调试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49602101/

10-11 22:13
查看更多