调整环境变量在Windows下使用gdb
gdb是一个十分方便的调试工具,不仅仅是对开发者,更是信息学竞赛者的一大利器,使用它在竞赛中往往可以获得更高的调试效率,我们可以轻松地查看到代码执行到哪一行时出现了问题,相比于IDE可以更加快速地输出各个变量的数值来分析程序所存在的问题。
然而许多人却因为不会在windows中配置gdb而望而却步,更有甚者在同时安装了fpc和gcc的电脑上使用gdb遇到了种种问题。这里来说明一下解决方法。
首先,在Windows系统中,对于命令行可以在任意目录直接执行的命令,取决于系统或用户环境变量中path的设置。通俗来说,系统在任意目录下只能直接执行在名为path的环境变量中的文件夹下的可执行程序。
然而,对于大多数OIer而言,所使用的Dev-C++在安装时并不会在环境变量中加上MinGW的安装目录,因此许多人对于许多竞赛书中所讲的gdb的使用一直没有去亲自尝试过。因此,我们就要把MinGW安装目录下的bin文件夹加入到path环境变量中。
首先,在Dev-C++中找到Compiler Options
之后,找到MinGW的安装目录
将这个目录加入到系统的环境变量中
对于XP系统,在“我的电脑”右键菜单的属性中就可以进入这个界面。而对于Vista-10这几个版本的Windows系统中,这个界面则是在系统属性的高级系统设置中。
我们找到用户或者系统的Path变量,然后加入刚才在Dev-C++中所见到的路径,放置于变量值的最前面,然后加上;
特别注意,一定要加上;
比如原来的环境变量是
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
此时应该更改为
C:\Program Files\Dev-Cpp\MinGW32\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
之后,再重新打开命令提示符,此时g++、gcc、gdb就可以使用了。这里要提到一点,为什么不把MinGW的目录加在最后。这是考虑到许多人同时有安装fpc,而fpc安装时会加入MinGW的gdb,由于大多数情况下该版本较旧所以可能遇到下图中的情况。
因此,这里把minGW的安装目录放在环境变量的最前面,就是为了让它拥有最高的优先级。诚然,把它放在fpc的目录前面再加上;也有同样的效果。实际上,为了防止改坏环境变量影响系统的正常运行,把minGW放在最后面是比较保守的选择。
这里在简述一下gdb使用的技巧,对于c++程序,使用g++ 文件名.cpp -g来编译程序,其中-g参数意为加入调试信息。默认编译后的文件名为a.exe,然后使用gdb a.exe进入调试,先使用b (行号)加入断点,比如在第10行加入断点的代码为b 10,之后按r运行程序,当程序停在断点时会显示程序停留的位置这一行的代码和所处的行号,这时可以使用bt查看调用栈,在查看调用栈时,可以使用up查看上一层调用栈。使用p +变量名输出变量信息,甚至是整个数组也都能这样全部输出出来。然后使用s命令代表单步进入下一行代码,使用c命令表示继续执行直到下一个断点为止。通常而言,使用gdb的p(print)命令查错的效率比在IDE中对变量一个个add watch更快,省去了许多在鼠标和键盘之间切换的时间。
对于奇奇怪怪的错误,gdb往往有更高的调试效率,比如曾经有一次局部变量中数组开太大超过了栈空间的限制,还有一次写一道很复杂的模拟题,因为多个变量太过复杂,当时模拟考试的时候用dev-c++一直没有调出来,后来去使用gdb对变量一个个print查看才发现了问题。而对于递归层次过多调用栈超过系统限制的情况,在gdb中使用bt查看也能很明显地看出来。
不过,对于动态规划题目的f数组,通常而言使用两层for循环按照自己的格式输出程序错误更能直观地找出问题。
最后,特别注意的是,对于标准输出,gdb只会截取到换行符为止,因此遇到gdb中程序没有输出的情况,可以检查是否在输出中加入了换行符。printf只需要补上\n,而cout补上endl即可。