65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 DevStudio 中的输出窗口

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (9投票s)

2004 年 2 月 24 日

CPOL

3分钟阅读

viewsIcon

59932

如何将任意文本加载到 DevStudio 输出窗口中,以便您可以单击一行

目录

引言

有没有像 lintgccgrep 或类似的工具,其输出会引用许多不同的地方?然后您必须手动仔细检查所有这些地方?如果能将该工具的输出加载到 DevStudio 中,然后只需双击该行即可直接跳转到该位置,那是不是很方便?

是的,我也这么想。但除了编写一个功能齐全的 DevStudio 插件或宏(这需要一些实际工作)之外,我不知道如何做到。现在我知道了,并且我要与同样一窍不通的人分享。我们大多数人都知道自己是谁!

背景

我的老板在我写的一些代码上运行了 lint。这个版本的 lint 非常挑剔(好),结果产生了 12,115 行需要检查(坏)。其中大部分可以忽略,但都需要检查。但仅仅是去到指示行所花费的时间和精力,至少需要 3 天。3 个漫长的日子。

肯定有更好的方法。所以我四处查看通常的地方,但令人惊讶的是,找不到如何将任意文件放入 DevStudio 输出窗口的帮助。我敢肯定,某个地方有微软的文章,但我没找到。有一些关于编写插件和宏的文章,包括格式化文件名和行号的要求,但没有更基础的内容。

事实证明这非常简单。您向 DevStudio 添加一个工具,运行该工具,然后该工具的标准(控制台)输出会进入其自己的输出窗口。

添加工具:分步指南

在 DevStudio 中:
  1. 转到“工具”菜单,然后选择“自定义...”
  2. 选择“工具”选项卡
  3. 滚动到底部
  4. 双击空白的矩形
  5. 输入工具名称,例如“Dump file”
  6. 勾选“使用输出窗口”
  7. 勾选“提示输入参数”
  8. 将命令设置为某个将参数复制到 stdout 的程序(我使用 catfile.bat,下面会完整展示)
  9. 将初始目录设置为 $(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 工具:

  1. 点击“工具”菜单
  2. 点击“Dump file”,并注意弹出一个窗口询问文件名

    Picture of one-liner dialog

  3. 输入文件名(如图所示)并点击“确定”。确保选中“重定向到输出窗口”。这正是本练习的目的!
  4. 文件被加载到其自己的输出窗口窗格中。双击一行,查看指示的行显示出来!

使用 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 -- 减小图片尺寸以适应低分辨率显示器,修正了拼写错误
© . All rights reserved.