相关文章推荐
玩篮球的松树  ·  vite buffer global is ...·  8 月前    · 
大鼻子的菠萝  ·  python - ...·  1 年前    · 
奋斗的烤土司  ·  c# - Server execution ...·  1 年前    · 

通过调试-》窗口-》调用堆栈,打开调用堆栈窗口。
在这里插入图片描述

调用堆栈窗口的重要功能是:可以找到当前函数的调用函数,以及依次往前的每一级调用函数。

调用堆栈窗口会按照函数的调用顺序来显示,窗口中顶部为栈顶,底部为栈底,栈底的函数最先被调用,每个函数调用称为帧,即栈帧,调用堆栈由一帧帧函数组成,其中的信息无法手动修改,如名称,路径,符号状态等,但可以通过设置控制器是否显示在窗口中。

调用堆栈窗口中排列着一组函数信息,内容主体是个函数栈,最上面的函数,就是第一级函数,是最后被调用的函数,也是在打上断点调试的情况下,当前进程运行到的位置,

第一级函数下面的第二级函数,就是调用了第一级函数的函数,
第二级函数下面的第三级函数就是调用了第二级函数的函数,
通过调用堆栈窗口可以很容易的理清当前运行到的位置函数的调用函数,也就是上一级函数是谁,通过在调用堆栈中双击某个函数就可以跳转过去。

在这里插入图片描述
在这里插入图片描述

但是调用堆栈窗口中显示的是自下而上有调用关系的函数,如果第二级函数调用第一级函数之前调用了其他的函数,其他函数是不会显示在调用堆栈的窗口中的。

设置符号信息
场景
在当前工程引入了外部动态库的情况下,程序员准备好了该动态库的源码,准备将源码附加到运行中的进程进行调试,排查有可能出现在动态库中的bug。

pdb符号文件
pdb文件就是文件后缀为.pdb的文件,pdb文件和动态库一起生成,名称和其对应的动态库相同,动态库常有更新时,对应的调试符号pdb也必须时刻与对应的源代码同步。
在这里插入图片描述

用法
将准备好的源代码附加给正确的进程号,调用堆栈窗口可以显示该进程调用到的动态库和函数,右键窗口-》符号设置,将保留pdb文件的路径复制到符号路径下,点击确定,编译器会自动加载符号,路径下的pdb会全部加载到当前进程中与之对应的被调用的动态库,也有部分动态库找不到pdb符号文件,但只要需要被调试的模块加载好了符号,就可以在该模块中打上断点,然后触发事件进行调试了。

通过本人亲测的使用总结; 还有使用到的配置文件( c++ 的),实在不会配置可以直接使用; 改一改配置文件,应该还可以生成c,java,c#语言的 调用 关系 图,本人亲测的是 c++ 老师再也不用担心我的 调用 关系 图了。 ^v^ ^o^ ^v^ 🐛Bug一词的原意是虫子,而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题,人们也叫它"bug"。这是为什么呢?这就要追溯到一个程序员与飞蛾的故事了。Bug的创始人格蕾丝·赫柏(Grace Murray Hopper),是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电脑程序的人之一。而代表电脑程序出错的“bug” 这名字,正是由赫柏所取的。1947年9月9日,赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机 运行 时,它突然停止了工作。 我们知道在Linux环境下使用gdb 调试 程序时,可以方便的使用bt命令打印出程序 堆栈 ,方便了解 函数 调用 堆栈 ,定位问题;那么在使用Visual Studio开发工具进行C/ C++ 程序 调试 时,如何 查看 堆栈 呢? 图形化的 VS 开发工具更方便我们 查看 程序 运行 堆栈 ,在程序进行Debug时,选择Debug菜单栏,进入Windows子项;然后继续进入Call Stack项,打开 堆栈 窗口 ... 开启冒险之旅我是一个线程,出生在这个Linux帝国,今天我的任务是去执行一段人类用C语言编写的代码。一阵忙活过后,一个fopen 函数 调用 的指令出现在我面前,跟随指令指向的方向,我来到了libc.so的地盘,进入了一个名为open的房间,房间里的桌上放了一张纸,上面写了一个编号和几句指令。根据指令,我需要把编号放到eax寄存器,把open 函数 的参数放到ebx、ecx、edx三个寄存器中。忙完上面的操... 在讲Go的 堆栈 之前,先温习一下 堆栈 基础知识。什么是 堆栈 ?在计算机中 堆栈 的概念分为:数据结构的 堆栈 和内存分配中 堆栈 。数据结构的 堆栈 :堆:堆可以被看成是一棵树,如:堆排序。在队列中,调度程序反复提取队列中第一个作业并 运行 ,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。栈:一种先进后出的数据结构。这里... 程序的执行过程可看作连续的 函数 调用 。当一个 函数 执行完毕时,程序要回到 调用 指令的下一条指令(紧接call指令)处继续执行。 函数 调用 过程通常使用 堆栈 实现,每个用户态进程对应一个 调用 栈结构(callstack)。编译器使用 堆栈 传递 函数 参数、保存返回地址、临时保存寄存器原有值(即 函数 调用 的上下文)以备恢复以及存储本地局部变量。不同处理器和编译器的 堆栈 布局、 函数 调用 方法都可能不同,但 堆栈 的基本概念是一样的。寄存器是处理器加工数据或 运行 程序的重要载体,用于存放程序执行中用到的数据和指令。因此 函数 调用 栈的实现与处理器寄存器组密切相关。Intel32位体系结构(简称IA32)处理器包含8个四字节寄存器,如下图 简单不先于复杂,而是在复杂之后。1. 什么是bug?导致计算机不能正常工作的错误叫做bug。2. 调试 是什么?所有发生的事情都一定有迹可循如果问心无愧,就不需要掩盖也就没有迹象了如果问心有愧,那就一定会有迹象顺着这条途径顺流而下就是犯罪,逆流而上,就是真相每一次 调试 都是尝试破案的过程。