使用 DevStudio 中的输出窗口






4.56/5 (9投票s)
如何将任意文本加载到 DevStudio 输出窗口中,
目录
引言
有没有像 lint、gcc、grep 或类似的工具,其输出会引用许多不同的地方?然后您必须手动仔细检查所有这些地方?如果能将该工具的输出加载到 DevStudio 中,然后只需双击该行即可直接跳转到该位置,那是不是很方便?
是的,我也这么想。但除了编写一个功能齐全的 DevStudio 插件或宏(这需要一些实际工作)之外,我不知道如何做到。现在我知道了,并且我要与同样一窍不通的人分享。我们大多数人都知道自己是谁!
背景
我的老板在我写的一些代码上运行了 lint。这个版本的 lint 非常挑剔(好),结果产生了 12,115 行需要检查(坏)。其中大部分可以忽略,但都需要检查。但仅仅是去到指示行所花费的时间和精力,至少需要 3 天。3 个漫长的日子。
肯定有更好的方法。所以我四处查看通常的地方,但令人惊讶的是,找不到如何将任意文件放入 DevStudio 输出窗口的帮助。我敢肯定,某个地方有微软的文章,但我没找到。有一些关于编写插件和宏的文章,包括格式化文件名和行号的要求,但没有更基础的内容。
事实证明这非常简单。您向 DevStudio 添加一个工具,运行该工具,然后该工具的标准(控制台)输出会进入其自己的输出窗口。
添加工具:分步指南
在 DevStudio 中:- 转到“工具”菜单,然后选择“自定义...”
- 选择“工具”选项卡
- 滚动到底部
- 双击空白的矩形
- 输入工具名称,例如“Dump file”
- 勾选“使用输出窗口”
- 勾选“提示输入参数”
- 将命令设置为某个将参数复制到 stdout 的程序(我使用 catfile.bat,下面会完整展示)
- 将初始目录设置为 $(Wkspdir) 或任何您喜欢的目录
要执行的工具 catfile.bat 非常复杂。这是其源代码:
type %1
使用工具
示例 - Lint 输出
好的,这里有一个例子。这是那个可怕的 lint 输出中的几行:
memcpy(&tmpOID[1], &almOID[0], oidLength * sizeof(OIDC_T)); SCTE-Alarms.cpp 599 Info 737: Loss of sign in promotion from int to unsigned int SCTE-Alarms.cpp 599 Warning 534: Ignoring return value of function 'memcpy(void *, const void *, unsigned int)' (compare with line 44, file string.h) string.h 44 Info 830: Location cited in prior message - int fullLen = tmpOID[0] + 1; // number of components in tmpOID[] SCTE-Alarms.cpp 601 Info 713: Loss of precision (initialization) (unsigned long to int)
在继续之前,请注意文件名和行号的顺序不是 DevStudio 可以识别的格式。DevStudio 需要的格式是: filename(linenumber): stuff所以我用了一个小的 Perl 脚本来处理文件:
my @file = <>; chomp @file; my $line; foreach $line (@file) { if($line =~ m/^(\S+)\s+(\d+)(.+)/) { print "$1($2):$3\n"; } else { print $line, "\n"; } }
现在这些行(我将它们保存在“munged.txt”中)看起来是: memcpy(&tmpOID[1], &almOID[0], oidLength * sizeof(OIDC_T)); SCTE-Alarms.cpp(599): Info 737: Loss of sign in promotion from int to unsigned int SCTE-Alarms.cpp(599): Warning 534: Ignoring return value of function 'memcpy(void *, const void *, unsigned int)' (compare with line 44, file string.h) string.h(44): Info 830: Location cited in prior message _ int fullLen = tmpOID[0] + 1; // number of components in tmpOID[] SCTE-Alarms.cpp(601): Info 713: Loss of precision (initialization) (unsigned long to int)
(显然,如果我要经常这样做,我会有一个专门的命令来执行 lint 然后执行 Perl。) 现在,要在 DevStudio 中使用 Dump file
工具:
- 点击“工具”菜单
- 点击“Dump file”,并注意弹出一个窗口询问文件名
- 输入文件名(如图所示)并点击“确定”。确保选中“重定向到输出窗口”。这正是本练习的目的!
- 文件被加载到其自己的输出窗口窗格中。双击一行,查看指示的行显示出来!
使用 GCC 的另一个示例
好的,我们再来试试另一个。我使用 gcc 处理了一个文件,得到了这个错误输出:sys_conf.h:709: error: `ULONG' was not declared in this scope sys_conf.h:709: error: syntax error before `)' token
文件名和行号仍然不太正确,但这个 Perl 脚本可以解决这个问题:
my @file = <>; chomp @file; my $line; foreach $line (@file) { if($line =~ m/^([^:]+):(\d+):(.+)/) { print "$1($2):$3\n"; } else { print $line, "\n"; } }
生成如下处理过的行: sys_conf.h(709): error: `ULONG' was not declared in this scope sys_conf.h(709): error: syntax error before `)' token现在运行
Dump file
工具,结果如下: 
值得关注的要点
这没有什么特别神奇或巧妙之处。它只是新颖而方便。但其中有一个“陷阱”:输出窗口最多只能容纳 8192 行。而且它存储的是您工具输出的*最后* 8192 行,而不是最开始的。猜猜我那 12K 行的 lint 文件是怎么发现这个问题的……
历史
- 2004/2/24 -- 首次发布
- 2004/2/25 -- 减小图片尺寸以适应低分辨率显示器,修正了拼写错误