巨大的C文件调试问题

7
我在项目中有一个源文件,其中有超过65,536行代码(确切地说是112,444行)。我正在使用一个“sqlite合并”,它是一个单独的巨大源文件。
我正在使用MSVC 2005进行调试时会遇到问题。一切都可以编译和链接。但是当我尝试进入一个函数并使用调试器时,它将显示错误的代码行号。
有趣的是,正确行号和调试器显示的行号之间的差异恰好是65536。这让我怀疑(几乎可以确定)是一些无符号短整型溢出。
我还怀疑这不是MSVC本身的错误。也许是调试信息格式的限制。也就是说,MSVC使用的调试信息格式将行号存储为2字节shorts。
是否有任何方法可以解决这个问题(除了将大型文件分割成几个较小的文件)?

4
为什么要调试SQLite汇编程序?SQLite有一个适当的分发版,它由多个单独的文件组成。 - NG.
如果它没有坏,就不要合并它。 - Adam Crossland
6个回答

9

根据微软论坛管理员的说法,这是调试器的已知问题(正如您所指出的,编译器似乎可以很好地处理它)。除了使用较短的源文件外,显然没有其他解决方法。请参见非常相似问题的官方回复此处


1

嗯,当我想查看sqlite的工作原理时,我复制了最后的约60000行代码到另一个文件中,然后使用#include将其引入。这非常简单且对我很有帮助。此外,如果您这样做,请注意不要在#ifdef语句内部进行分割。


1
该帖子说:“(除了将大文件分割成几个较小的文件之外)”。 - Lightness Races in Orbit
这篇文章确实是这么说的,但是建议修改发帖者的前提条件或假设是完全可以的。将文件分成三部分(现在需要这样做,因为合并后的文件有超过2 * 2 ^ 16行)是解决真正问题的完美方案,即使用符号调试器对SQLite代码进行调试。我刚刚自己需要做到这一点(为什么?因为我需要找出原因,在SQLite文档中没有记录,在其他任何地方都没有提到,某个SQLite函数失败了;我在5分钟内找到了答案)。 - Graham Asher

0

如果您查看符号调试信息的文档,您将看到用于行号的类型。例如,IDiaSession::findLinesByLinenumlinecolumn参数都是DWORD类型。

编辑:正如@valdo指出的那样,这仍然不意味着调试器能够正确处理巨大的行号。因此,您必须使用较短的文件。很遗憾存在这样的限制,但即使没有,我仍然建议您拆分源代码。


让我不同意一下。即使IDiaSession/IDialSession接口声明了DWORD参数,也并不意味着实际存储的调试信息带有DWORD行号。该接口可能只是设计用于支持更大的行号,而不一定被实现。 - valdo

0

你有没有考虑使用WinDBG呢?作为Windows团队用于调试操作系统的工具,它非常强大,里面有一些超级大的文件(至少上次我看的时候是这样)。


尚未。然而,正如我所说的,这似乎是调试信息格式的限制,而不是调试器中的某些错误。 - valdo

0
对于任何在文件行数小于65536行时出现错误行号的人:我发现我的问题是由于源文件中存在不一致的行尾符导致的。有129个\r换行符,而其余部分是\r\n风格。调试器行和正确行之间的差异也是129。

-1

除非你正在修改SQLite,否则你应该相信它正在执行它的工作。完全没有必要介入。SQLite在发布之前会经过大量测试。


3
像这样的评论应该作为对问题的评论。这并没有试图回答提问者的问题,或者其中固有的一般性问题。 - Ben Zotto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接