《C语言程序设计进阶教程》一2.7 在DDD(命令行调试程序)上检测调用栈

简介: 本文讲的是C语言程序设计进阶教程一2.7 在DDD(命令行调试程序)上检测调用栈,本节书摘来华章计算机《C语言程序设计进阶教程》一书中的第2章,第2.6.2节, Intermediate C Programming[美] 陆永祥(Yung-Hsiang Lu) 著 徐东 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.7 在DDD(命令行调试程序)上检测调用栈

本文讲的是C语言程序设计进阶教程一2.7 在DDD(命令行调试程序)上检测调用栈,在编辑器中输入下面的程序,并把名字存为p1.c
screenshot
screenshot
不要担心还不能完全理解main函数中的argv,这将会在之后讨论。在Linux终端下使用下面的命令创建可执行文件:
screenshot
这里使用gcc将C程序(p1.c)的源文件转化为计算机可以理解的可执行文件。添加-g启用调试,这样我们可以检验调用栈。添加-Wall和-Wshadow启用警告信息。影子变量将会在4.1节中进行讲解。警告信息有时是良性的,但是它们通常表明在代码中有深层的问题。总是启用警告信息并按照gcc的建议去做是一个好的习惯。输出文件(即可执行文件)的名字由-o所指定。在本例中,p1是此gcc命令的输出,因此是可执行文件(即程序)。它可以通过在终端中输入下列内容来运行:
screenshot
输出应该和下面相同:
screenshot
要看到调用栈,我们需要启动调试工具。在本例中,我们将使用DDD(命令行调试程序)。DDD是一个针对GDB调试工具的图形用户界面。启动DDD,进入菜单并点击:
File→Open Program→select p1→Open
这里,我们已经选择了可执行程序而不是.c文件。调试工具将自动地基于gcc留在可执行文件中的信息找到.c文件。当调试一个使用多个源文件的程序时这会很有用。
在底部窗口(gdb)提示之后,可在两个函数g1和g2中使用下面的指令设置断点:
screenshot
指令b g1指示DDD在函数g1开始时设置一个断点。当程序到达g1的第一行,程序将停止,你会有机会检查程序的状态。指令b g2指示DDD在函数g2开始时类似地去设置一个断点。
通过在(gdb)提示时输入下面的指令来执行此程序:
screenshot
程序将会启动,然后在函数g2的断点处停止。为什么程序在g2处停止而不是g1呢?因为main函数调用g2,所以g2在g1之前被执行。如果设置了多个断点,那么程序将按照它们被执行的顺序停止在断点处,而不是按照它们被设置的顺序。在本例中,虽然在g1中的断点是先设置的,但程序先执行g2。所以,程序将先停在g2中的断点处。
要继续这个程序,输入下面的指令:
screenshot
程序将继续执行,之后停在下一个断点处,该断点位于函数g1中。调用栈可以通过调用栈回溯查看到。这可以用下面的指令完成:
screenshot
这条指令的意思是“栈回溯”。你会在调试工具中看到什么?
screenshot
a和b的值在顶部栈帧中显示。每一行的起始显示了调用栈的栈帧(0、1和2),与函数g1、g2和main函数相对应。可以使用f命令来看到不同的栈帧:例如,输入:
screenshot
可以看到frame1,即函数g2的栈帧。a和b的值被再一次地显示。它们的值是多少呢?0x之后的数字在你的计算机上可能与此不同,这些就是地址。在g2的栈帧中,a和b的值与顶部栈帧中的值不同。图2.6~图2.9显示了一些DDD的截图。
screenshot
screenshot
screenshot
screenshot

原文标题:C语言程序设计进阶教程一2.7 在DDD(命令行调试程序)上检测调用栈

相关文章
|
1月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
103 1
|
3月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
157 0
|
1月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
1月前
|
编译器 C语言 C++
VSCode安装配置C语言(保姆级教程)
VSCode安装配置C语言(保姆级教程)
|
1月前
|
C语言
C语言调试
C语言调试
19 0
|
1月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
2月前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
97 10
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
14天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
29 6
下一篇
无影云桌面