Visual C++ Browse Database的探索

你好,我是吉姆·斯普林菲尔德。 这篇文章将介绍一些关于在VS2010中如何在浏览数据库中表示信息的低级细节。 正如我在上一篇文章中提到的 邮递 我们使用SQL Server CytoEdio(SSCE)来存储关于解决方案中所有C、C++和IDL文件的信息。 我将展示一些SQL示例,说明如何在这个数据库中挖掘有关代码的信息。

null

注意:我们在VS2010中使用的特定数据库模式在将来的版本中可能会发生很大的变化,因此我所展示的示例在VS的未来版本中可能不起作用。

打开SDF文件

数据库文件(SDF)通常可以在与解决方案文件(SLN)相同的目录中找到,但如果您的SLN位于网络共享或闪存驱动器上,它可能会被重新定位。 可以使用几种不同的工具打开SDF。 如果您有权访问SSMS(sqlservermanagementstudio),它是一个很好的工具。 但是,您也可以在visualstudio中打开它。 在打开要使用的SDF之前,最好关闭关联的解决方案。

1. 在VS中,转到“服务器资源管理器”窗口,右键单击“数据连接”,然后选择“添加连接…”。

2. 选择“Microsoft SQL Server Compact 3.5”作为数据源,然后单击“继续”。

3. 单击“浏览…”按钮,然后导航到要打开的SDF文件。

4. 如果SDF文件很大(即>250MB),则需要在打开之前设置一个选项。 要执行此操作,请单击“高级…”按钮,并将“最大数据库大小”设置为大于要打开的SDF的值。 4091MB是允许的最大值,如果您愿意,可以直接使用它。

5. 最后,点击“OK”按钮,VS将打开您的SDF文件。

学习你的方法

如果在服务器资源管理器中展开SDF的新节点,将看到一个“表”节点。 展开它,您可以看到当前定义的所有表。 “codeu items”表包含源代码中出现的每个定义和声明的信息。 我没有足够的空间来展示所有桌子的功能,但是看看周围。 不要期望在refs或symbols表中看到数据,因为它们是为了将来可能的使用而存在的。

注: 不要试图对模式或索引进行更改,并期望这些更改能够持续下去。 当我们打开SDF进行实际浏览时,我们会进行一致性检查,如果有任何不“正确”的地方,我们会删除SDF并重建它。

看看“代码项目种类”表。 您可以通过右键单击并选择“显示表格数据”来查看内容。 这里应该有59个条目。 这些值在“代码项”表中使用,您可以在查询中使用它们来查找特定类型的代码项。

创建查询

右键单击“代码项目”表并选择“新建查询”。 您将获得一个查询窗口,其中包含一些帮助您构建和运行查询的工具。 将弹出一个窗口,要求您添加一个表。 只需单击“关闭”,因为您现在只需将查询复制到查询窗口中。

先试试这个问题,把脚弄湿。 要运行查询,请单击工具栏中的红色感叹号图标或按“Ctrl+R”。

从类别为1的代码项中选择*

此查询返回所有C++类的代码项。 如果你看所有的专栏,大多数应该是感觉到了。 请注意,数据库提供了整个类的开始和结束位置信息,只提供了代码项的名称部分。 但是,很难看到代码项来自哪个文件,因为codeu items表使用的是文件id而不是文件名。 要同时查看文件名,请尝试以下查询,该查询与files表进行联接以获取文件名。

选择 f、 姓名,ci*

将项目编码为ci

在ci.fileu id=f.id上作为f的内部连接文件

哪里 (ci.kind=1)

需要注意的一点是,此查询返回有关在您自己的代码以及SDK和其他头中出现的代码项的信息。 您可以使用“configu files”表返回显式位于解决方案中的文件的信息。 此表有一列指示文件是隐式的还是显式的。 一个文件在configu files表中可能有多个条目,因为一个文件可以在多个配置/项目中使用。 “DISTINCT”关键字防止返回代码项的重复副本。

选择 不同的f.名称,ci*

将项目编码为ci

在ci.fileu id=f.id上作为f的内部连接文件

内部连接配置文件为cf ON ci.fileu id=cf.fileu id

哪里 (cf.implicit=0)和(ci.kind=1)

codeu items表中的父项u id引用codeu items表中的另一项。 使用这些信息,您可以获得一些父/子信息。 0的id是全局命名空间。 因此,要获取全局命名空间中的所有函数,可以这样做。

选择 *

代码u项

哪里 (kind=22)和(parentu id=0)

您还可以将codeu items表联接到自身,以查找其父级与某一组条件匹配的一组codeu项。 下面的示例查找其父代码u项名为“ATL”的所有函数。

选择 第1章*

将项目编码为ci1内部连接

在ci2.id=ci1.parentu id上将u项编码为ci2

哪里 (ci1.kind=22)和(ci2.name=’ATL’)

对于如何挖掘SDF以获得有关源代码的有趣信息,我只做了一些皮毛的工作。 有许多其他方法可以利用SDF中包含的数据来收集有关源代码的信息。 我们的所有浏览功能C/C++都是在SDF的顶部实现的。 为了提高性能,我们确实利用了SSCE提供的一些缓存、准备好的命令和特殊的“表直接”模式,但是在某些时候,一切都来自SDF。

SSCE中的查询处理器在某些方面受到限制,但您甚至可以将SDF中的数据复制到完整的SQL数据库中,并执行比SSCE所允许的更复杂的查询。

吉姆·斯普林菲尔德 Visual C++架构师

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享