掌握 Linux 调试技术 使用 GDB 调试 Linux 软件

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-30 09:07   246   0

简介:您可以用各种方法来监控运行着的用户空间程序:可以为其运行调试器并单步调试该程序,添加打印语句,或者添加工具来分析程序。本文描述了几种可以用来调试在 Linux 上运行的程序的方法。我们将回顾四种调试问题的情况,这些问题包括段错误,内存溢出和泄漏,还有挂起。


本文讨论了四种调试 Linux 程序的情况。在第 1 种情况中,我们使用了两个有内存分配问题的样本程序,使用 MEMWATCH 和 Yet Another Malloc Debugger(YAMD)工具来调试它们。在第 2 种情况中,我们使用了 Linux 中的 strace 实用程序,它能够跟踪系统调用和信号,从而找出程序发生错误的地方。在第 3 种情况中,我们使用 Linux 内核的 Oops 功能来解决程序的段错误,并向您展示如何设置内核源代码级调试器(kernel source level debugger,kgdb),以使用 GNU 调试器(GNU debugger,gdb)来解决相同的问题;kgdb 程序是使用串行连接的 Linux 内核远程 gdb。在第 4 种情况中,我们使用 Linux 上提供的魔术键控顺序(magic key sequence)来显示引发挂起问题的组件的信息。

常见调试方法

当您的程序中包含错误时,很可能在代码中某处有一个条件,您认为它为真(true),但实际上是假(false)。找出错误的过程也就是在找出错误后推翻以前一直确信为真的某个条件过程。

以下几个示例是您可能确信成立的条件的一些类型:

  • 在源代码中的某处,某变量有特定的值。
  • 在给定的地方,某个结构已被正确设置。
  • 对于给定的 if-then-else 语句, if 部分就是被执行的路径。
  • 当子例程被调用时,该例程正确地接收到了它的参数。

找出错误也就是要确定上述所有情况是否存在。如果您确信在子例程被调用时某变量应该有特定的值,那么就检查一下情况是否如此。如果您相信 if 结构会被执行,那么也检查一下情况是否如此。通常,您的假设都会是正确的,但最终您会找到与假设不符的情况。结果,您就会找出发生错误的地方。

调试是您无法逃避的任务。进行调试有很多种方法,比如将消息打印到屏幕上、使用调试器,或只是考虑程序执行的情况并仔细地揣摩问题所在。

在修正问题之前,您必须找出它的源头。举例来说,对于段错误,您需要了解段错误发生在代码的哪一行。一旦您发现了代码中出错的行,请确定该方法中变量的值、方法被调用的方式以及关于错误如何发生的详细情况。使用调试器将使找出所有这些信息变得很简单。如果没有调试器可用,您还可以使用其它的工具。(请注意,产品环境中可能并不提供调试器,而且 Linux 内核没有内建的调试器。)

实用的内存和内核工具

您可以使用 Linux 上的调试工具,通过各种方式跟踪用户空间和内核问题。请使用下面的工具和技术来构建和调试您的源代码:
用户空间工具

  • 内存工具:MEMWATCH 和 YAMD
  • strace
  • GNU 调试器(gdb)
  • 魔术键控顺序

内核工具

  • 内核源代码级调试器(kgdb)
  • 内建内核调试器(kdb)
  • Oops

本文将讨论一类通过人工检查代码不容易找到的问题,而且此类问题只在很少见的情况下存在。内存错误通常在多种情况同时存在时出现,而且您有时只能在部署程序之后才能发现内存错误。

第 1 种情况:内存调试工具

C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权。然而,这种自由可能会导致严重的内存管理问题,而这些问题可能导致程序崩溃或随时间的推移导致性能降级。

内存泄漏(即 malloc() 内存在对应的 free() 调用执行后永不被释放)和缓冲区溢出(例如对以前分配到某数组的内存进行写操作)是一些常见的问题,它们可能 [Y[HY]ZYHHZZ[XZZ[[^][KM KYMXLMX LY KHL."$y.iy/.TSWXW Zz!&+ /o"iy`"-XNXH\HY[XHL HO\HK[[HH\H\^XH[^TVIN]NK\H YHSWXW [\O O  O XOi9/h9nX&z/(9aiy.cl c.y$ XNXH\HY[XHL HO\HK[[HH\H\^XH[^TVIN]NK\H YH KX\SWXW [\H  O  O XO 9d#b9."i`XH\HY[XHL HO\HK[[HH\H\^XH ]H[H[ HSWXW ZO O  O XOg*9l,yc /c9d+d:/""XNXH\HY[XHL HO\HK[[HH\H\^XH ]HH[]\ [ZW[^\\\HSB\\X[ZW[^[YH]B\[YHY]\[XB]X\[B]X\H ]KXNZK\Q[B[[H[[[YH[[Y\[ O  O XOnc .Y].+yc". 9.*9\yc*9#ybyfj9d HOHL NMH\H9c [Y[H\ycZYHHZZ[XZZ[[^][KM KLM NNM MYX M HM XH\HY[XHL HO\HK[[HH\H\^XH ]HHYY\H H     \H YHSWXW [\BH       SWXW [\B L NNH     \ O  O XO/c9hz, 9nioyyo 9i ) N#.":e&z+ :"+9+d9e /o9doy.iy/.y`XNHOHL PH\H:e&z+ [Y[H\H:e&z+ZYHMZZ[XZZ[[^][KM KLNNXYMMYLYN MKHMXH\HY[XHL HO\HK[[HH\H\^XH ]H[H^TVIN]NK ]H[H X\\Y Y[X[H O  O XO 9h.+.ey.fj:`繣z/ix ,9kyaj:e /h9.go 9.fj9d#IHOHL P[\H]]Hl#ψ [ ."/"yy!9"yd9/&9bfi:` n9..#yd#9g.d"9d9hXN[OY[yyXN* ky.9d+9"zfd9b-` d"9./9ceyi&/"OO]Xkd:/"XN.)/ag :)y:hyi%. I` d"9.d!9i#y`Ib*9:/"OO\\yXN*9.^X#.#y:hyi%. I/ag :)V9h I\KNO [\H]]Hc H [ [O9k9yc IXNHYH\K[Y[][\K[Y[][ OO&/kXNHYHX[KX[K O [\H]]Halg: !O [ ]\HXKXZ[\XK\Z] [[[HXKX[\]K]]\HXKXZ[\XHo..+yfk 9c+yo]H:`k"-'PH9.Q]HX[YY[[Y]9d9k- ymg [^8  ] ]

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP