使用Windbg时遇到的几个典型问题说明

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Windbg时遇到的几个典型问题说明相关的知识,希望对你有一定的参考价值。

目录

1、将Windbg附加到以管理员权限运行的目标进程上失败

1.1、问题概述

1.2、登录用户类型与管理员权限(操作权限、运行权限)

2、无法将dump文件拖到Windbg中打开

3、使用Windbg打开Windows任务管理器中导出的dump文件,看不到有效的函数调用堆栈

3.1、使用.effmach X86命令,切换到32位上下文

3.2、Windbg帮助文档

4、最后


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931        最近同事在使用Windbg过程中接连遇到几个问题,找我帮忙处理一下,今天在这里把这几个问题说明一下,供大家借鉴或参考。

1、将Windbg附加到以管理员权限运行的目标进程上失败

1.1、问题概述

       同事维护的软件在运行过程中出现了崩溃,但程序中安装的异常捕获模块并没有捕获到,没有生成dump文件。既然异常捕获模块没有捕获到,那么可以尝试将Windbg附加到目标进程上调试运行,应该能感知到异常。

        于是重新软件,启动Windbg去附加到进程上,结果附加时报如下错误:

提示目标进程拒绝访问。难道是权限的问题?于是问了一下同事,他们的软件是不是设置了以管理员权限运行的。确实是这样的,那就对了,那Windbg肯定是以标准用户权限(权限低,非管理员权限)运行的。在Windows系统中,低权限的进程是禁止访问高权限进程的,所以以标准用户权限运行的Windbg是没法附加到以管理员权限运行的目标进程上的。

       需要将Windbg以管理员权限,找到Windbg,右键点击,在弹出的右键菜单中选择以管理员权限运行,如下所示:

然后就能附加到目标进程上了。

1.2、登录用户类型与管理员权限(操作权限、运行权限)

       一般以管理员权限运行的程序,就可以执行一些需要管理员权限的操作了。这个地方关于程序运行权限,需要大概地说明一下。

在Windows系统中,登录用户主要分超级管理员Administrator、普通管理员和标准用户三类,其中标准用户的权限是最低的。

       程序是否以管理员权限运行和当前登录的用户类型有到一定的关系。在标准用户登录时,所有程序默认都是以标准用户权限运行,如果启动的程序设置了以管理员权限运行,则会弹出输入管理员用户的界面,以管理员账户运行该程序,才能申请到管理员权限。

       在超级用户Administrator登录时,超级用户Administrator拥有最高的权限,所有的程序,不管有没有申请以管理员权限运行,都会以管理员权限运行。

       在普通管理员用户登录时,如果程序没有设置以管理员权限运行的属性,启动时默认是以标准用户权限运行的。如果程序设置了以管理员权限运行的属性,则会以管理员权限运行。如果程序以管理员权限运行,启动时会弹出UAC提示框,提示程序可能会对系统进行修改。

       那么如何设置程序以管理员权限运行的属性呢?一般我们是用微软的VisualStudioIDE工具来开发C++应用程序的,我们可以在VisualStudio中的工程属性中,在链接器->清单文件->UAC执行级别中选择requiredAdministrator选项即可,如下:

        那何时需要将程序设置以管理员权限启动呢?Windows从Vista系统开始就引入了UAC权限控制机制,强化了管理员权限的概念,做了更严格的权限限制与安全控制。比如对一些权限敏感的路径,比如C:\\ProgramFiles、C:\\Windows\\system32,如果要在这些路径下创建文件、向文件中写数据,都是需要管理员权限的。再比如,在Windows系统的注册表中,如果要向HKEY_LOCAL_MACHINE节点写入或修改内容时,也需要管理员权限的。还比如,程序中可能需要向Windows系统中注册控件,这也是需要管理员权限的。

       比如安装包程序一般会将程序默认安装到敏感路径C:\\ProgramFiles路径中,需要向HKEY_LOCAL_MACHINE注册表中写入内容,所以一般安装包都需要管理员权限运行。在普通管理员登录的场景下,设置以管理员权限运行的程序,其图标右下方会有个盾牌标识,该标识表示程序需要管理员权限运行。比如如下的一些安装包程序:

2、无法将dump文件拖到Windbg中打开

        同事打开Windbg,打算将某个dump文件拖入到Windbg中进行分析,结果拖动后Windbg没反应,Windbg并没有打开这个dump文件。于是同事又找到我,我一开时大概猜到了原因,问道是不是Windbg以管理员权限启动的?同事说确实是的,那就对了!dump文件时位于explorer.exe资源管理器进程中,而资源管理器进程默认是以标准用户权限运行的,Windbg是以管理员权限启动的,所以资源管理器进程与Windbg进程权限又不对等了,不能将dump文件从地权限的资源管理器进程拖入到高权限的Windbg中。

        解决办法很简单,不要右键以管理员权限启动Windbg就好了。

3、使用Windbg打开Windows任务管理器中导出的dump文件,看不到有效的函数调用堆栈

3.1、使用.effmach X86命令,切换到32位上下文

        同事维护的软件发生了卡死问题,于是让出问题的客户通过Windows任务管理器将对应进程的dump文件导出到磁盘上,客户导出后将dump文件发了过来。从Windows任务管理器导出dump文件的入口如下所示:

        软件出现卡死和软件崩溃闪退是不同的概念,可能是发生死循环了导致接口没返回,也可能是多线程发生死锁,现象一直保留着,不像软件崩溃就进程直接就退出了。像这种卡死的问题,可以直接在问题电脑上安装Windbg,直接将Windbg覆盖到问题进程上去查看分析的。

       但问题处在客户的电脑上,不能占用客户的电脑,再者客户可能是涉密单位不允许外面的用户远程查看的。所以选择了第二种方式,即从Windows任务管理器中问题进程的dump文件导出来,发给我们。同事拿到文件后,使用Windbg打开,查看到如下的函数调用堆栈:

这个调用堆栈有些奇怪,堆栈中模块不是我们业务程序的模块,堆栈中的函数完全和代码中的接口函数对不上,难道是导出的dump有问题。于是同事又找到我,让我帮忙看一下是怎么回事。这类问题我们以前处理过,一看就大概知道是什么原因了。这个程序肯定是32位的,而所在的Windows系统肯定是64位的,所以从Windows任务管理器中导出的dump文件打开后默认显示的是64位上下文,而64位上下文中的函数调用堆栈很奇怪,和代码中的接口是完全对不上的。在查看函数调用堆栈之前,需要使用.effmach X86命令,切换到32位的上下文,然后再用kn命令去查看就好了,如下:

在堆栈中看到了我们程序的模块ukeyproxy.dll,但看不到具体的函数名,是因为没有加载pdb符号库的原因。

3.2、Windbg帮助文档

       这个地方需要简单地说一下Windbg自带的帮助文档。点击Windbg菜单栏的Help->Index,打开chm格式的帮助文档。当我们记不住具体的命令时,可以到帮助文档中模糊搜索,比如这个地方我们用到的.effmach命令,直接输入.eff就匹配到相关条目了,如下:

双击就可以打开.effmach命令的详细说明页面了,如下:

4、最后

        上面几个问题都是在帮同事排查问题时遇到的,本文大概地整理了一下,以供借鉴或参考。下次大家在遇到的类似的问题时就可以对照着处理了。

以上是关于使用Windbg时遇到的几个典型问题说明的主要内容,如果未能解决你的问题,请参考以下文章

大数据应用的几个典型例子

iOS : Zbar几个经典问题的解决办法

VSCode JAVA环境配置使遇到的几个小问题

python -- 解决"pip install pandas"时遇到的几个小问题

做毕设遇到的几个小知识点

做毕设遇到的几个小知识点