做什么

之前有一次梦中所得,既然可以让vs附加到进程去调试活动的dll,那要是可以让我本地的电脑去调试别人客户端或者测试环境的DLL就好了,这样就可以不通过dbgview去一个个输出看,而是可以直接调试到参数检查,并且根据报错检查问题所在了。

也正是这样的机缘巧合之下了解到远程调试工具,不得不感叹微软真的是一家伟大的公司,连这样的工具都有。

怎么做

实际上的工程应用很简单,步骤如下:

1.首先确定Visual Studio版本,比如你是2019版的VS,你就使用2019版的调试工具,总之调试方VS和被调试方的调试工具要保持版本一直。

这里就拿VS2019举例。

首先找到VS2019的调试工具,个人路径不同,如果你是默认设置可以参考一下我的路径

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Remote Debugger\x86

注意这个工具是分版本的,一般无脑用x86就行

image

注:这个文件夹是可以直接拎出来单独使用的,不需要别的依赖。

然后这个文件夹就可以随时拿出来,你可以放到自己的U盘或者移动硬盘什么的位置,方便随时取用的就行。

然后就可以把这个工具放到一台客机上,双击msvsmon.exe打开,打开后界面如此:

2.客机设置:

[VS工程技巧]远程调试工具及dump文件来检查程序崩溃及异常等问题-小白菜博客
(注:在私有网络环境下才开启无身份验证,如果是公网请务必谨慎谨慎再谨慎,否则造成损失概不负责)
这里点击工具->选项->无身份验证->允许任何用户调试->最长空闲时间设为114514

image

提示这个之后就说明已经开启了连接。

3.主机设置

在主机上打开想要调试的DLL的工程文件,点击调试->附加到进程

选中连接类型->远程(无身份验证)->连接目标->查找

image

[VS工程技巧]远程调试工具及dump文件来检查程序崩溃及异常等问题-小白菜博客
如果能连接的上,这里应该已经有指定的机器了
然后就可以让VS在远程网络环境下附加在指定 exe上进行调试了。

请务必保证两端DLL的代码保持一直,同时为了保证断点能够正常被命中,需要将主机中的pdb文件移植到客机的同位置上

image

比如这两个文件,如果你希望远程调试能够正常运行,则必须要把这个.pdb文件放在同目录下,因为实际上你本地进行这个DLL的调试也是通过这个.pdb文件进行的。也就是说,二者的pdb文件也最好需要保持一直,否则很难保证其能正常运作。

dump文件

dump文件的话,我之前有分享过一个qt的dump库,当然了google也有类似的库

Github:https://github.com/LeventureQys/LgQDumper

这个库的话,就是可以在程序异常退出的时候留出一块内存出来返回一个类似错误日志一样的dmp文件,vs可以直接分析,给它对应的pdb文件,就可以找到指定代码的位置并像正常的VS调试时报错一样指出是哪里除了问题。

这个也需要配合.pdb文件一起使用,这个东西的使用局限性比较大,关键时刻可能会给你提供思路,但不能过度依赖它,因为有时候它可以指出报错,但如果是空悬指针或者内存溢出,堆栈损坏等情况,可能会提供给你一个提示,但是并不会告诉你具体错在哪。

除此之外,它也无法告诉你运行的应用程序依赖的库的错误,比如A.exe依赖了B.dll,如果B.dll发生异常崩溃,那么A.exe是捕获不到B.dll的异常崩溃的,但是会返回给你一段代码告诉你比如0xC0000005这样的错误,不过不会告诉你具体在哪。

总而言之,言而总之,能用就行,不用奢望太多