Windbg可以看到Visual Studio中看不到的有效函数调用堆栈

news2025/7/19 21:02:00

目录

1、Visual Studio中看不到有效的函数调用堆栈

2、使用Windbg调试运行主程序,看到了有效的函数调用堆栈

3、根据函数名和行号去查看对应的C++源码,定位问题

4、总结


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931       最近遇到一个主程序启动报错的问题,在Visual Studio中启动调试会报出异常,点开call stack函数调用堆栈页面却看不到有效的函数调用堆栈。后来尝试使用Windbg启动主程序进行调试,报出异常时Windbg中却看到了完整的函数调用堆栈。这个问题也正是借助Windbg的动态调试解决的,今天就来分享一下该问题完整的排查分析过程。

1、Visual Studio中看不到有效的函数调用堆栈

       在给新人搭建项目在Debug下的运行调试环境时,先是拷贝了底层各个模块的Debug版本dll库,将项目中需要编译的工程添加到解决方案中进行编译,最后在Visual Studio中启动Debug下主程序的调试,结果主程序还没启动起来就报错了,弹出如下报错提示框:

提示框中显示的错误描述信息为:Access violation executing location 0x00000000,即执行0x00000000地址时产生了访问违例,这个0x00000000是代码段的地址,很有可能是call了这个无效的代码段地址引发的访问违例。

       于是切换到Call Stack函数调用堆栈页面,去查看此时的函数调用堆栈。但并没有看到有效的函数调用堆栈,如下所示:

看不到有效的函数调用堆栈,这个问题就不好分析了。难道是底层的dll库之间不匹配导致的?亦或是Debug版本的dll库与Release版本的dll混用导致的?

2、使用Windbg调试运行主程序,看到了有效的函数调用堆栈

       Visual Studio调试状态下看不到有效的函数调用堆栈,于是想尝试使用Windbg启动主程序调试运行,看看在发生异常时能否看到有效的信息。使用Windbg打开目标主程序开始调试,Windbg确实捕获到了异常,中断了下来。于是输入kn命令,查看到如下的函数调用堆栈:

       Windbg确实很强大啊,Windbg中看到了发生异常时的完整函数调用堆栈。从上图可以看到,异常崩溃发生在mediaxxx.dll模块中。因为没有pdb文件,所以函数调用堆栈中只能看到崩溃发生在mediaxxx.dll模块中,看不到具体的函数名。

       于是输入lm vm mediaxxx*命令去查看mediaxxx.dll文件的时间戳:

该dll库的时间戳为:2022年8月3日15时45分09秒,该时间就是mediaxxx.dll库文件编译生成的时间,按照这个时间点到版本服务器上查找对应时间的pdb文件。取来pdb文件后,将pdb文件的路径添加到Windbg中(在添加页面记得勾选Reload选项),然后重新输入kn,看到了详细的函数名,如下:

看到问题是发生在initgloble函数的553行代码上:

J:\media\media***\source\video\videocom***.cpp @ 553

此外,还能看到该函数位于哪个cpp文件中。

3、根据函数名和行号去查看对应的C++源码,定位问题

      于是将完整的函数调用堆栈发给维护mediaxxx.dll库的同事,根据显示的函数名和行号,去查看C++源码,看看出问题的代码是啥样子的。

       查看到如下的这行代码:

这里的m_pHWDec_Startup变量应该是个函数指针,此处通过该指针中保存的函数地址,去调用对应的函数的。于是搜索给m_pHWDec_Startup指针变量赋值的地方,找到了如下的代码:

根据同事提示,此处是从uniplay.dll库中动态获取PLAYXX_Startup函数地址,赋值给m_pHWDec_Startup函数指针变量的。

       所以,调用uniplay.dll中的接口是通过动态加载库的方式去操作的,很有可能是主程序的路径中缺少uniplay.dll库文件导致PLAYXX_Startup函数获取失败,所以m_pHWDec_Startup函数指针为空,这样代码中去call了这个空指针,所以出现了“Access violation executing location 0x00000000”异常。经查看,主程序的路径中确实是没有uniplay.dll库文件的,手动将该库拷贝到主程序的目录中就没问题了。

4、总结

       在使用Visual Studio等IDE工具调试C++代码的过程中遇到了异常,如果看不到有用的信息或线索,可以尝试使用Windbg等调试工具去动态调试目标程序,看看发生异常时能否看到有用的内容。

       类似的问题,以前我们也遇到过,当代码中发生Stack overflow线程栈溢出时,Visual Studio会直接停止调试,退出调试状态,这样也就看不到异常发生的函数调用堆栈了。但用Windbg动态调试目标进程时发生线程栈溢出,则可以看到完整的函数调用堆栈。本文恰好是另一个实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Frechet distance距离计算原理及python实现

Frechet distance概念 弗雷彻距离(Frechet distance)定义了一种考虑位置和点的次序的计算两条曲线相似度的方法,常用于时间序列相似度度量和轨迹序列相似度度量。该指标的算法可用the walking dog problem来描述:想象一个人用牵引带遛狗的同时&#xff0…

“碳”零排放是什么意思

在气候变化问题上拖拖拉拉之后,澳大利亚联邦政府终于承诺到 2050 年实现净零排放,世界其他大部分地区也是如此。几乎所有发达经济体现在都加强了 2030 年目标,并承诺在本十年将排放量大致减半。 需要记住的重要一点是,如果没有本…

abbyy finereader2023泰比文字识别PDF编辑软件

近年来,随着盲人数字阅读的普及推广,PDF格式的电子书越来越受到大家的关注和喜爱,但受读屏软件功能的限制,扫描版的PDF电子书是无法直接阅读的,这就需要将其转换为可阅读的文档格式,可对于大多数视障读者来…

Linux基本指令1

系统内核:Centos 7.6 64位操作系统(OS, operating system)是什么?世界上第一台计算机诞生的时候是没有操作系统的,但是这个计算机操作起来效率特别低,难度非常高。使用对象只有科学家。操作系统的意义就在于降低操作难度&#…

数据库高级 V

数据库高级 V 1.JVM内存结构,JVM调优,GC常用算法 如何调整堆内存大小,以及调整各年代之间的比例,更换GC 修改JVM堆大小方式: 找到Idea安装目录下的-->bin-->idea.exe.vmoptions -server -Xms128m //堆初始大小 -Xmx512m //最大堆内存 -XX:ReservedCodeCacheSize240m -XX…

[附源码]计算机毕业设计JAVA花卉销售管理系统

[附源码]计算机毕业设计JAVA花卉销售管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

Linux umask命令详解,Linux修改文件默认访问权限

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 umask命令一、查看umask值二、临时修改umask值三、永久修改umask值四、文件和目录的默认权限五、权限数值对照表六、常用umask值及对应权限七…

最近公共祖先(朴素法、倍增法、(递归法))

目录 一、前言 二、题一:二叉树的最近公共祖先 1、上链接 2、基本思路 (1)朴素法 (2)LCA倍增法。 3、朴素法代码 (1)C(AC) (2)python&am…

1.2 极限的性质【极限】

1.2 极限的性质【极限】 1.2.1 唯一性 极限的唯一性 引入 假设警察逮捕罪犯,把犯人追到了悬崖边上,那么犯人只能在悬崖边束手就擒,这个时候悬崖边是犯人逃跑的极限位置,别无去处,位置唯一。 考试或比赛的时候都努…

web前端开发技术纯静态 (12306官网 1页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#…

WebDriverManager自动管理浏览器Driver包

WebDriverManager是什么? WebDriverManager是一个开源 Java 库,它以全自动方式管理(即下载、设置和维护) Selenium WebDriver所需的驱动程序(例如,chromedriver、geckodriver、msededriver 等)…

【ASM】字节码操作 工具类与常用类 Printer、ASMifier、Textifier 介绍

文章目录 1.概述2. Printer2.1 class info2.2 fields2.3 constructors2.4 methods3. ASMifier与Textifier3.1 如何使用3.2 从命令行使用3.3 visit方法3.4 从代码中使用1.概述 在上一篇文章中:【ASM】字节码操作 工具类与常用类 TraceClassVisitor 介绍 我们知道了如何使用Tra…

nodejs+vue+elementui个人图书分享共享网站

本面向图书共享系统主要包括两大功能模块,即用户功能模块和管理员功能模块。 (1)管理员模块:首页、个人中心、图书分类管理、图书信息管理、用户管理、用户分享管理、联系我们、社区交流、系统管理。 (2)用…

多功能电子密码锁的设计与制作

目 录 第一章 绪论 1 1.1 课题背景和意义 1 1.2 多功能电子密码锁发展趋势 2 第二章 总体设计方案的确定 3 2.1 多功能电子密码锁设计的具体要求 3 2.2 总体设计方案选定 3 第三章 系统硬件设计 5 3.1 设计原理 5 3.2 单片机STC89C51简介 5 3.3 AT24C02存储芯片 9 3.4 LCD显示模…

《Deep learning Based Text Classification:A comprehensive Review》文本综述

介绍 深度学习综述年年有,今年特别多。随着深度学习在机器学习领域的快速发展,对每个任务进行算法的总结对于之后的发展是有益的。综述可以梳理发展脉络,对比算法好坏,并为以后的研究方向进行启发。本文是在NLP领域中重要的任务-…

KT148A语音芯片常见问题集锦|硬件|软件以及注意事项-长期更新

目录 1.1KT148A是什么? 具备哪些功能? 有什么特色? 1.2KT148A工作电压多少?电流是多少?控制方式是多少?支持多大的喇叭? 1.3KT148A我焊接到PCB板上面之后,为什么没有任何反应呢&a…

基于动态时间规整算法(DTW)的语音识别技术研究-含Matlab代码

⭕⭕ 目 录 ⭕⭕⏩ 一、引言⏩ 二、动态时间规整算法基本原理⏩ 三、语音识别实例分析⏩ 四、参考文献⏩ 五、Matlab代码获取⏩ 一、引言 在语音识别技术的发展过程中,动态时间规整算法(Dynamic Time Warping,DTW)一直处于重要地…

Mysql

1.约束 2.数据库设计 3.多表查询 4.事物 5.新增/删除/修改语句 6.单表条件查询 7.函数 8.创建数据库/数据表 执行顺序 第一步:from 指定要操作的表 第二步:join 连接表生成一个笛卡尔积 第三步:on 对笛卡尔积进行筛选 第四步&#xff1a…

Pytorch深度学习实战(1)—— 使用LSTM 自动编码器进行时间序列异常检测

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

并发编程面试题

并发 为什么要使用并发编程(并发编程的优点) 并发编程可以提升 CPU 的计算能力的利用率,通过并发编程的形式可以将多核CPU 的计算能力发挥到极致提升程序的性能,如:响应时间、吞吐量、计算机资源使用率等。并发程序可…