欢迎访问生活随笔!

生活随笔

您现在的位置是:首页 > 形式科学 > 操作系统 > Windows

Windows

win764位旗舰版使用技巧-()

发布时间:2022-10-09Windows 电脑专家
win764旗舰版使用技巧。  GNU调试器是发现程序缺陷的有力工具。  如果你是程序员,想在你的软件中添加一些功能,你首先考虑实现它的方法:比如写一个方法,定义一个类,或者创建一个新的数据类型。然后

  win764旗舰版使用技巧。

  GNU调试器是发现程序缺陷的有力工具。

  如果你是程序员,想在你的软件中添加一些功能,你首先考虑实现它的方法:比如写一个方法,定义一个类,或者创建一个新的数据类型。然后你使用编译器或解释器可以理解的编程语言来实现这个功能。但是,如果你认为你所有的代码都是正确的,但是编译器或解释器仍然不能理解你的指令呢?如果软件在大多数情况下运行良好,但在某些环境下有缺陷呢?在这种情况下,你必须知道如何正确使用调试器来找到问题的根源。

  GNU调试器GNUProjectDebugger(GDB)是发现项目缺陷的有力工具。它通过跟踪程序运行过程中发生的事情来帮助你发现程序错误或崩溃的原因。(LCTT校注:GDB全程是“GNUProjectDebugger”,即“GNU项目调试器”,但是通常我们简称为“GNU调试器”)。

  本文是GDB实践教程的基本用法。请遵循示例,打开命令线,克隆仓库:。

  快捷方式GDB每一个命令都可以缩短。例如,显示设定的断点命令可以缩短为。你可能在其他地方看到过这个缩写,但在这篇文章中,为了清楚地显示使用的函数,我写了整个命令。

  命令行参数你可以将GDB附加到每个可执行文件中。进入你克隆的仓库(),运行进行编译。现在你可以看到一个名字的可执行文件。(更多信息,请参考我的文章《创建与调试》Linux转储文件。)。

  要将GDB请输入此可执行文件:。

  你的输出应如下所示:。

  调试符号未找到返回结果。

  调试信息是目标文件objectfile调试信息包括数据类型、函数签名、源代码和操作代码之间的关系。此时,您有两种选择:。

  使用调试信息编译继续调试汇编码(见下面的无符号调试)。

  编译调试信息您必须重新编译二进制文件中的调试信息。打开,删除第9注释标签()重新编译:。

  告知编译器包含调试信息。运行,接着运行,然后再调用GDB。您可以在输出后调试代码:。

  新增的调试信息会增加可执行文件的大小。在这种情况下,执行文件增加了2.5倍(从26,088字节增加到65,480字节)。

  输入,使用开关启动程序。当程序运行到达时时将崩溃:。

  您可以检索有关程序的其他信息,命令提供当前文件的信息:。

  101行代码语言:C调试格式的编译器(版本、调优、架构、调试标志、语言标准):DWARF没有预处理器宏指令(使用)G宏只在编译时使用-g3可用于标志编译)。命令在虚拟地址空间中打印动态库列表机的地址,启动时加载到该地址,以便程序运行:。

  假如你想知道Linux请参阅我的文章在Linux如何处理动态库和静态库。

  调试程序你可能已经注意到你可以了GDB中使用命令启动程序。调试程序你可能已经注意到你可以了GDB中使用命令启动程序。命令接受命令行参数,就像从控制台启动程序一样。

  -c1开关会导致程序第一4阶段崩溃。从头开始操作程序,不用退出GDB,只需再次操作run-c1CtrlC。

  您还可以一步一步地操作程序。在C/C中,入口是mainlistmainmain。

  函数的部分源代码:函数在第33所以可以输入在33行加断点:。

  输入run。

  运行程序。正如预期的那样,程序在mainlayout。

  你现在处于GDB文本用户界面(TUI)模式。用键盘向上和向下的箭头键滚动查看源代码。

  GDB高亮显示当前执行。你可以输入nextn。

  )命令逐行执行。若未指定新命令,GBD会执行上一个命令。只需按操作代码,只需按回车键即可。

  如果发生这种情况,请按下重置屏幕。

  CtrlXA可随时进出TUI模式。您可以在手册中找到其他键绑定。要退出GDB,只需输入。

  设置监察点该示例程序的核心是在无限循环中运行的状态机。变量列举了所有当前状态:假如你想做。

  n_state的值为停止程序。为此,请在main停止程序并为函数。

  n_state设置监督点:。

  watchn_state==State_5。

  当你输入continue在继续运行程序时,您将获得以下输出:。

  如果您继续操作程序,当监控点表达式评估为false时GDB将停止:当一般值变化、特定值、读取或写入时,可以设置监测点。

  改变断点和监督点输入infowatchpoints。

  删除断点和监控点如你所见,监察点是数字。改变断点和监督点。

  输入打印以前设置的监控点列表:。

  删除断点和监控点如你所见,监控点是数字。要删除特定的监控点,请先输入。

  delete输入监控点号后。例如,我的监察点编号是2。删除此监控点,输入。

  delete2。如果你使用。

  delete而没有指定数字,所有infobreakpoint。

  打印断点列表:。

  要删除单个断点,请先输入delete输入断点号。另一种方法:您可以通过指定断点的行号删除断点。例如,命令将删除第78行设置的断点号7。禁止或启用断点和监督点除了删除断点或监控点外,还可以输入。

  disable,输入禁用断点或监控点。断点在下面3和4禁用,并在代码窗口用减号标记:disable2-4。

  在一定范围内修改断点或监测点。如需重新激活这些点,请输入enable。

  条件断点delete。

  删除所有断点和监控点。您仍然希望程序停止mainbreakmain从而在main在函数处添加断点。输入。

  run程序将从头开始运行停止函数。main。

  函数包括变量n_state_3_count,当状态机达到状态时3变量会增加。n_state_3_count。

  break54ifn_state_3_count==3继续运行程序。程序将在第54停止前运行状态机3次。要查看请输入:。

  printn_state_3_count。

  使断点成为条件断点。

  现有的断点也可以成为条件断点。用。

  clear54命令删除最近添加的断点,并通过输入break54命令添加一个简单的断点。您可以输入以下内容,使此断点成为条件断点:。

  指断点号。

  在其他源文件中设置断点。

  若您的程序由多个源文件组成,则可在行号前指定文件名设置断点,例如,。

  breakmain。cpp:5。捕捉点除断点和监控点外,还可设置捕获点。捕获点适用于执行系统调用、加载共享库或引起异常等事件。

  用于写入的捕获STDOUT的请输入系统调用:。

  当程序写入控制台输出时,GDB中断执行。你可以在手册中找到一整章断点、监控点和捕捉点的内容。评估和操作符号。

  用命令可以打印变量值。一般语法是。

  print。请输入修改变量值:。

  在下面的截屏中,我将变量n_state_3_count123。

  /x表达式以16进制打印值;使用&。

  您可以在虚拟地址空间中打印地址。

  如果不确定符号的数据类型,可以使用whatis来查明。maininfoscopemain。

  DW_OP_fbreg值是指基于当前子程序的堆栈偏移量。或者,如果你已经在一个函数中列出了当前堆栈帧上的所有变量,你可以使用它infolocals:。

  gdbattach命令允许您指定过程ID(PID)附加到已经在运行过程中进行调试。幸运的是,目前的程序PID打印到屏。