我从来没有使用过调试器,现在是时候试一试了。MinGW 似乎附带了我一直在尝试使用的 GDB。假设从命令行运行 gdb 并键入run myprog.exe
会启动调试器,但是当我这样做时,我得到了
启动程序:C:\MinGW\bin\myprog.exe MyProg.exe [New Thread 1828.0xd8c] 打开文件时出错。[Inferior 1(进程 1828)以代码 02 退出]
如何进行或有什么更简单的方法?
特别是我试图清除未定义的行为。
由于您的程序终止,您需要设置一个断点来查看任何内容。break main
在运行线之前尝试。然后您可以执行命令行next
(下一行),step
(步入/退出函数调用),print expression
(其中表达式可以是变量名或函数调用或计算),display expression
(与打印相同,但在每个提示之前打印) . 在任何给定点,您都可以键入backtrace
以获取调用堆栈。您甚至可以键入up
并向down
上移动调用堆栈,以便打印更高的局部变量。
使用 gdb 传递二进制文件
gdb <binary>
然后将断点设置为 main
gdb) break main
然后在 gdb 中运行你的程序
gdb) run
然后断点命中使用 'n' 或 'next' 步进到不同的行
gdb) n
使用 's' 进入函数并使用 'p' 打印 var 值
例子 :
gdb) s <fun_name>
gdb) p x
好吧,实际上,最简单的方法是使用 IDE。您可能想尝试一下code::blocks - 非常易于使用,在安装时为您配置所有内容(只需确保选择一个编译器 - 不用担心,它会提示您)然后就可以了设置并准备出发。由于它是多平台的,它也不会真正将您锁定在 Windows 中,并为您提供非常强大(而且,我猜更重要的是,方便)图形调试的可能性。
我建议,作为初学者从 Visual Studio 开始。它有一个非常好的和易于使用的调试器。只需在要开始调试的行中创建一个断点(单击该行旁边的左侧栏或右键单击并创建一个断点)。设置断点后,您只需在调试模式下运行程序,程序的执行将在创建断点的位置停止。
此时,您应该能够查看有关程序执行的所有有价值的信息。您可以使用 F10 继续执行步骤或使用 F11 进入执行树。
调试器与许多其他高级功能一样,如条件中断、命中计数等,但您可以从它的基本功能开始。
如果我编译这样的程序:
gcc -o my-prog -g myprog.c
然后我可以像这样调试my-prog
它的可执行文件:
gdb my-prog
该-g
选项告诉gcc
生成完整的调试信息。其他编译器将有他们自己版本的这个选项(例如 MSVCcl
命令有这个/Zi
选项)。
由于您在gdb
程序上运行时遇到问题,因此可能值得检查它是否首先使用调试信息进行编译。调试信息通常在与您编译程序的位置相同的位置生成。