OutputDebugString没反应?常见问题排查与解决

吉云

今天跟大家唠唠嗑,说说我最近折腾 `OutputDebugString` 的那些事儿。这玩意儿,说起来简单,用起来嘛还真遇到一些小坑,这里就跟大家分享一下我的填坑过程。

我对 `OutputDebugString` 的理解就是个打印调试信息的函数,没啥特别的。就像我写代码,遇到个问题,想看看某个变量的值,或者想知道程序是不是走到某个分支,就直接往代码里扔一句 `OutputDebugString("这里执行!");`。

结果?

OutputDebugString没反应?常见问题排查与解决

在 Visual Studio 里面跑起来,满心期待地去看“输出”窗口,结果啥也没有,空空如也,当时我就懵。心想,这玩意儿是不是坏?

我第一反应是赶紧上网搜,看看是不是我用法不对。搜出来的结果五花八门,什么“取消勾选 ‘将所有输出窗口文本重定向到即时窗口’”,什么“检查是不是有其他编辑器抢Debug信息输出窗口”,还有说版本不对的。

我一个个试过去,挺折腾的。

  • 我按照网上的说法,去 VS 的“工具/选项/调试/常规”里,把那个“将所有输出窗口文本重定向到即时窗口”的勾给取消。 结果,还是不行!输出窗口依然一片空白。
  • 然后,我又想是不是有其他的程序在捣乱。 我关掉所有其他的编辑器和调试工具,只留下 Visual Studio。结果,依然没有动静。
  • OutputDebugString没反应?常见问题排查与解决

  • 我又怀疑是不是 Visual Studio 的版本有问题。 毕竟我的 VS 不是最新版的,会不会是 bug 导致的? 但是重装VS实在太麻烦,就先放下。

折腾一圈,啥也没解决,当时我就有点怀疑人生。

后来我冷静下来,仔细想想,会不会是我的姿势不对?于是我重新仔细阅读 `OutputDebugString` 的文档,注意到一点:这个函数是把信息输出到调试器的输出窗口,那是不是我没有附加调试器?

我试着在 Visual Studio 里,先“启动调试”,然后再运行我的程序。 奇迹出现!“输出”窗口里终于出现我用 `OutputDebugString` 打印的信息。

原来,`OutputDebugString` 只有在调试器附加到进程的时候才能正常工作。如果程序直接运行,没有调试器,它就没地方输出信息。

OutputDebugString没反应?常见问题排查与解决

但是新的问题又来,每次都要附加调试器才能看到输出,也太麻烦。

我又开始想,有没有什么办法,不用附加调试器也能看到 `OutputDebugString` 的输出?

网上搜一下,发现个好东西:`DebugView`。这是一个微软官方提供的工具,专门用来捕获 `OutputDebugString` 的输出信息。下载安装之后,运行 `DebugView`,它就会自动捕获系统中所有进程通过 `OutputDebugString` 输出的信息。

这下方便!以后我只要运行 `DebugView`,就可以随时看到我的程序通过 `OutputDebugString` 输出的调试信息,再也不用每次都附加调试器。

不过`DebugView` 也有一些需要注意的地方:

    OutputDebugString没反应?常见问题排查与解决

  • `DebugView` 需要以管理员权限运行。 否则,它可能无法捕获到所有进程的输出信息。
  • `DebugView` 会捕获系统中所有进程的 `OutputDebugString` 输出。 如果你想只看自己的程序的输出,需要在 `DebugView` 中设置过滤器。

这回折腾 `OutputDebugString` 的经历,让我对这个函数有更深入的理解。虽然过程有点曲折,但是最终还是解决问题。希望我的分享能帮助到大家,少走一些弯路。遇到问题,多查资料,多思考,总能找到解决办法的。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]