基本C++调试问题

4
我需要学习汇编语言才能充分使用调试器吗?在调试会话中,我看到了一些难以理解的代码和CPU寄存器(eax……等等)。我想这就是汇编语言,我应该从中解密问题的原因。
有没有什么捷径可以不学习汇编语言就能理解调试器?
PS:我看到了一本将近1000页的汇编书,我没有勇气去读它。请帮帮我。
编辑:**** 我正在使用codeBlocks ide。但我觉得这个问题即使对于MSVC++也是成立的。

2
你在编译时是否通过了“-g”选项?http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html - notnoop
最好至少提到你所谈论的开发环境和调试器是什么。 - Georg Fritzsche
学习编程确实很难,但它会让你变得更好。把它看作是一种训练吧。 - toto
我正在使用免费的CodeBlocks集成开发环境。 - Dr Deo
除非你试图调试一个优化构建、一个没有可用的调试符号的构建,或者你试图调试一个疑似代码生成错误的情况,否则你不需要理解汇编语言来进行调试。 - JoeG
8个回答

11

虽然在调试过程中一些汇编语言的知识可能非常有用,但对于您来说更有价值的可能是确保正确获取调试符号(debugging symbols)

如果使用的是 gcc 编译器,请使用 -g 标志。 如果使用的是 Visual Studio 编译器,则在项目设置中启用调试符号生成(即使是发布构建也要启用)。 如果您使用其他编译器,请查阅其相关文档。

最后,但同样重要的是,如果您使用的是 Windows 操作系统,请考虑为其二进制文件下载调试符号,因为这可能会使您的工作变得轻松许多。 在此处找到链接: Microsoft 网站


5

听起来像是控制权跳转到了一个没有源代码或没有使用调试信息构建的库中。

熟悉机器架构和汇编语言可能有所帮助,但并不是使用调试器的必需条件。


2

是的。为了最优地进行调试,您必须理解汇编语言,它只是处理器所使用的语言。

这并不可怕。编程语言没有比汇编更简单的了。


编程语言比汇编简单得多,也更易读。但它们并不会变得更基础。 - David Thornley
3
David说:“我觉得汇编语言非常简单:所有的语义都是明确且写在手册上的。没有隐藏的虚拟机,没有编译器重写。对我来说似乎很简单。” - Paul Nathan

2

你不必成为汇编语言的专家,但我认为理解汇编代码对于调试很重要。找一些“只需要掌握足够的汇编知识”的教程,比如这个


1

在Windows上使用Visual Studio或在Unix上使用Data Display Debugger,只要您编译时使用调试符号,并允许您在不了解汇编语言的情况下逐步执行C++代码,就可以做出非常好的工作。熟悉所用机器架构、基本理解汇编语法以及C++结构如何映射到其中将使您更进一步。


0

你不需要理解汇编语言就能进行有效的调试。唯一需要关注汇编代码的时候是当你遇到优化问题时,但即使在这种情况下,你最好处理高级别的代码而不是尝试编写更有效的汇编程序。


0

你使用的平台是什么?VS2010将大大提高调试体验。


首先,它如何提高调试体验?其次,这与他实际的问题有什么关系?VS2008 完全可以允许您调试 C++ 代码,因此虽然 2010 可能在其他方面更好,但 OP 所问的特定问题早在 2010 年之前就已得到解决。 - jalf
我同时使用C++、C++ CLI和C#,但目前我的调试体验很糟糕。我期待VS2010正式版的发布。 - Hamish Grubijan

0

C++不需要应用程序存储元数据来帮助调试。如果找不到这样的元数据,那么调试器就没有太多可用的信息。它所看到的只是正在执行的机器代码,因此必须退回到显示纯汇编代码。

然而,编译器通常能够构建调试信息供调试器使用。这些基本上告诉编译器源代码的样子(或者在哪里找到源文件),以及哪些指令与哪些源代码行匹配,使您能够调试实际编写的C++代码。

您没有指定使用哪个编译器或调试器,因此我无法告诉您如何在您的特定情况下使用它。

在GCC上,据我所知,您必须使用-g进行编译,以便生成GDB可以使用的调试信息。

在Visual Studio中,大多数情况下应该可以正常工作(尽管我相信如果您启动一个“空的C++项目”,则必须自己启用调试信息,在项目属性中)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接