作者:Alexandra Hoffer URL:http://www.cprogramming.com/gdbtutorial.html
翻译: Hiram Lee
GDB (GNU Debugger的简写)是可以用于C和C++的一款强大的调试工具。调试器这个程序可以让你在程序 运行时检查程序状况来找出错误。你可以看看源代码,观察变量,跟随控制流程,在一个有限的循环中设一个断点,还有更多可以做的事。本文快速介绍一下GDB最常用和最有用的命令和技巧。
开始
要使用GDB调试程序,只需在提示符后键入GDB<程序名字>,你也可先开启GDB,然后如果你有一个发调试的core dump文件的话,可以这样写load<程序名字>。当做完这些时,输入run就可以运行程序了。你可以输入C(表示控制)来与程序交互,这个C会出现在GDB的界面上。输入continue可以从GDB返回到你的程序。GDB中的所有命令都可以缩写为一个独一无二的字母,即它的首字母。因此只需输入c来代替continue。如果你感到困惑的话,GDB有一个内置的帮助系统可以给你演示你可以用GDB做的所有一切和如何做。在提示符下输入help就可进入。一旦你找到你的bug,按control_Dgo 退出GDB。 啥时运行几个GDB会立即让你不解,所确保一次只运行一个GDB程序。
查看
在GDB提示符下有两类命令你可以使用。一种命令是告诉GDB如何做,别一种只是让它给你信息。这小节我们讨论后一种命令。你可以输入print <变量>让GDB告诉你变量的值,这种命令就好像是在C或着C++中运行的一样,举个例子,你可以输入print myarray[5]来查看一个矩阵中特定的元素,或着输入print struc.label来查看一个结构体的成员。
Lisat是另一种有用的命令,它告诉你你在哪,它会给出附近的几行代码。你再输入list,会看到下10行的代码。你可以输入list<行号>来查看某个特定部分的程序。举例来说,如果你想看20行的程序,输入list20。如果程序有多个源文件,你可输入list<文件名>:<行号>来标明你想发查看的部分。你可以选择使用list<函数名>来检查一个函数的开始。
第三个命令backtrace用于查看程序的堆栈,当输入backtrace时,你可以看到一个还没有返回和被调用的函数的清单,输入up 和down来改变范围,这样就可以看到调用函数的状态了。
断点
使用GDB有很多调试的技巧,但有一些是更学用和更有用的。其中之一就是设置断点,断点是程序运行到某一个地方是自动停止,这样你就可以查看整个程序的状态。设置断点,输入break<行号>。break的语法同list.
和break联合使用的一个非常有用的命令叫next,这个next命令会把程序运行至下一行,然后马上再回到GDB的提示符下。 你也可以给next一个参数,例如next 100,这个程序会在运行完第100个指令时停下来。
命令watch也挺有用,无论变量的值如何改变你都可以观测这个变量和设置断点。然而,设置一个观察点会友让GDB的速度下降很多,困此除非你有自己的unix机器,尽量避免使用。
Messing with
有一组命令虽然不经常使用,这些指令实际上是在程序运行时进行修正。比如指令call会调用一个特殊的函数,set variable指令会把程序的一个变量设置为一个特称的值,,比如set varibale i = 0, Return 这个指令会把当前的函数返回到调用它的函数。
技巧
现在你已经学了这些简洁的命令,如何使用它们呢。 这里有一些常见的调试的问题,这些技巧就用了用武之地。
1 Segfaults and Core Dumps
当你的程序发生这个错误时,怎么办?最简单的办法就是在GDB里运行直到发生了段错误。当程序崩溃时,GDB就会告诉你哪一行出错了。一般是程序中试图要对一些变量进行内存复杂操作时发生的。你可以用bt(或着backtrace)找出你所以栈的位置,再用p来查看变量,观察是否有超出范围或过多临时量的情况。有一个捷径,你用GDB调试你的程序,然后load 文件corefile,这个文件导致了崩溃。
2无限循环
无限循环是一个很难自己找到的错误,但用gdb很简单,在GDB里load程序,运行到循环。点击control_c迫使回到GDB提示符。输入bt,就可以知道现在在哪一行。使用list查看代码,看是否能找到什么引起了循环。如果找不到的话,使用n(或着next)把一次进行一个循环,同时 使用p来查看变量。
3隐晦错误
大部分错误难以简单分类,经常出现的是你的程序给出一些不明显的原因导致 的错误输出,当出现这种问题时有这样一此技巧。一种是当你的程序要求输入时设置一个断点,然后一路next
再观察栈和变量,难保一切都是按预想的进行。如果你认为你的问题是因为鞭一个变量引起的,代码上很难看出,那你就监测变量。
翻译: Hiram Lee
GDB (GNU Debugger的简写)是可以用于C和C++的一款强大的调试工具。调试器这个程序可以让你在程序 运行时检查程序状况来找出错误。你可以看看源代码,观察变量,跟随控制流程,在一个有限的循环中设一个断点,还有更多可以做的事。本文快速介绍一下GDB最常用和最有用的命令和技巧。
开始
要使用GDB调试程序,只需在提示符后键入GDB<程序名字>,你也可先开启GDB,然后如果你有一个发调试的core dump文件的话,可以这样写load<程序名字>。当做完这些时,输入run就可以运行程序了。你可以输入C(表示控制)来与程序交互,这个C会出现在GDB的界面上。输入continue可以从GDB返回到你的程序。GDB中的所有命令都可以缩写为一个独一无二的字母,即它的首字母。因此只需输入c来代替continue。如果你感到困惑的话,GDB有一个内置的帮助系统可以给你演示你可以用GDB做的所有一切和如何做。在提示符下输入help就可进入。一旦你找到你的bug,按control_Dgo 退出GDB。 啥时运行几个GDB会立即让你不解,所确保一次只运行一个GDB程序。
查看
在GDB提示符下有两类命令你可以使用。一种命令是告诉GDB如何做,别一种只是让它给你信息。这小节我们讨论后一种命令。你可以输入print <变量>让GDB告诉你变量的值,这种命令就好像是在C或着C++中运行的一样,举个例子,你可以输入print myarray[5]来查看一个矩阵中特定的元素,或着输入print struc.label来查看一个结构体的成员。
Lisat是另一种有用的命令,它告诉你你在哪,它会给出附近的几行代码。你再输入list,会看到下10行的代码。你可以输入list<行号>来查看某个特定部分的程序。举例来说,如果你想看20行的程序,输入list20。如果程序有多个源文件,你可输入list<文件名>:<行号>来标明你想发查看的部分。你可以选择使用list<函数名>来检查一个函数的开始。
第三个命令backtrace用于查看程序的堆栈,当输入backtrace时,你可以看到一个还没有返回和被调用的函数的清单,输入up 和down来改变范围,这样就可以看到调用函数的状态了。
断点
使用GDB有很多调试的技巧,但有一些是更学用和更有用的。其中之一就是设置断点,断点是程序运行到某一个地方是自动停止,这样你就可以查看整个程序的状态。设置断点,输入break<行号>。break的语法同list.
和break联合使用的一个非常有用的命令叫next,这个next命令会把程序运行至下一行,然后马上再回到GDB的提示符下。 你也可以给next一个参数,例如next 100,这个程序会在运行完第100个指令时停下来。
命令watch也挺有用,无论变量的值如何改变你都可以观测这个变量和设置断点。然而,设置一个观察点会友让GDB的速度下降很多,困此除非你有自己的unix机器,尽量避免使用。
Messing with
有一组命令虽然不经常使用,这些指令实际上是在程序运行时进行修正。比如指令call会调用一个特殊的函数,set variable指令会把程序的一个变量设置为一个特称的值,,比如set varibale i = 0, Return 这个指令会把当前的函数返回到调用它的函数。
技巧
现在你已经学了这些简洁的命令,如何使用它们呢。 这里有一些常见的调试的问题,这些技巧就用了用武之地。
1 Segfaults and Core Dumps
当你的程序发生这个错误时,怎么办?最简单的办法就是在GDB里运行直到发生了段错误。当程序崩溃时,GDB就会告诉你哪一行出错了。一般是程序中试图要对一些变量进行内存复杂操作时发生的。你可以用bt(或着backtrace)找出你所以栈的位置,再用p来查看变量,观察是否有超出范围或过多临时量的情况。有一个捷径,你用GDB调试你的程序,然后load 文件corefile,这个文件导致了崩溃。
2无限循环
无限循环是一个很难自己找到的错误,但用gdb很简单,在GDB里load程序,运行到循环。点击control_c迫使回到GDB提示符。输入bt,就可以知道现在在哪一行。使用list查看代码,看是否能找到什么引起了循环。如果找不到的话,使用n(或着next)把一次进行一个循环,同时 使用p来查看变量。
3隐晦错误
大部分错误难以简单分类,经常出现的是你的程序给出一些不明显的原因导致 的错误输出,当出现这种问题时有这样一此技巧。一种是当你的程序要求输入时设置一个断点,然后一路next
再观察栈和变量,难保一切都是按预想的进行。如果你认为你的问题是因为鞭一个变量引起的,代码上很难看出,那你就监测变量。
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/5570/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
评论列表