2010-05-20 133 views
7

我在我的项目中有一个源文件,它有超过65,536个代码行(确切地说是112,444)。我正在使用一个“sqlite合并”,它来自一个巨大的源文件。巨大的C文件调试问题

我正在使用MSVC 2005.问题在调试期间到达。一切编译和链接好。但是当我试图用调试器进入一个函数时 - 它显示了不正确的代码行。

有趣的是,正确的行号和调试器显示的行号之间的差异恰恰是65536.这使我怀疑(几乎可以肯定)一些无符号的短溢出。

我也怀疑它不是MSVC本身的错误。也许这是调试信息格式的限制。也就是说,MSVC使用的调试信息格式将行号存储为2字节短。

有没有什么可以做到这一点(除了将大文件切割成几个较小的文件)?

+4

为什么调试sqlite合并? sqlite有一个适当的分布,是许多单独的文件。 – 2010-05-20 16:01:09

+0

如果它没有损坏,请不要合并它。 – 2010-05-20 16:03:32

回答

8

根据一位MS调解员的说法,这只是一个调试器的已知问题(编译器似乎正如你指出的那样处理它)。显然没有解决方法,除了使用较短的源文件。请参见对非常类似问题的官方回应here

0

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

编辑:正如@valdo所指出的那样,这并不意味着调试器可以正常工作,而且行数很大。所以你必须使用较短的文件。不幸的是,这种限制存在,但即使没有,我仍然建议你分裂你的来源。

+0

好吧,让我不同意。 IDiaSession/IDialSession接口用DWORD参数声明的事实并不意味着用DWORD行号存储的* actual *调试信息。该接口可能只是设计用于支持更大的行号,不一定是实现的。 – valdo 2010-05-20 19:11:11

0

除非你修改SQLite,否则你应该相信它正在完成它的工作。根本不需要介入。 SQLite在发布之前会经过大量测试。

+2

像这样的编辑可能应该是对这个问题的评论。这并不是试图回答OP的问题,也不是试图回答OP所固有的一般问题。 – 2010-05-20 22:02:34

0

你有没有看过使用WinDBG呢?由于Windows团队使用它来调试操作系统,并且存在一些biiiig文件,或者至少在我上次查看的时候,它的功能非常强大。

+0

还没有。但是,正如我所说的,它似乎是调试信息格式的限制,而不是调试器中的一些错误 – valdo 2010-05-21 06:08:28

1

那么,当我想看看sqlite是如何工作的时候,我拿走了最后的60000行,将它们移动到另一个文件,然后#include它。这很简单,为我做了诀窍。另外,如果你这样做,注意不要在#ifdef里面分割。

+1

该帖子说“(除了将大文件切割成几个较小的文件)”。 – 2011-07-07 14:30:41

+0

这篇文章的确确实实在在地表达了这一点,但建议海报的前提条件或假设应该修改完全没问题。将文件切分为三部分(现在需要合并超过2 * 2^16行)是真正问题的完美解决方案,即使用符号调试器调试到SQLite代码。我只需要自己做(为什么?因为我需要找出原因,SQLite文档中的任何地方都没有文档,以及我可以找到的其他地方没有提到,某个SQLite函数失败;我在5分钟内就找到了)。 – 2014-01-31 14:36:03

0

对于有不正确行数的文件的人< 65536行:我发现我的问题是因为源文件中的行不一致行尾。有123 \r换行符,其中文件的其余部分是\r\n样式。调试器行和正确行之间的差异也是129。