Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 巨大的C文件调试问题_C++_C_Visual Studio - Fatal编程技术网

C++ 巨大的C文件调试问题

C++ 巨大的C文件调试问题,c++,c,visual-studio,C++,C,Visual Studio,我的项目中有一个源文件,它有超过65536行代码(确切地说是112444行)。我使用的是一个“sqlite合并”,它包含在一个巨大的源文件中 我正在使用MSVC2005。问题在调试期间出现。一切编译和链接正常。但是,当我尝试使用调试器单步执行函数时,它会显示错误的代码行 有趣的是,正确的行号与调试器显示的行号之间的差异正好是65536。这使我怀疑(几乎可以肯定)一些未签名的短溢出 我还怀疑这不是MSVC本身的一个bug。也许这是调试信息格式的限制。也就是说,MSVC使用的调试信息格式将行号存储为

我的项目中有一个源文件,它有超过65536行代码(确切地说是112444行)。我使用的是一个“sqlite合并”,它包含在一个巨大的源文件中

我正在使用MSVC2005。问题在调试期间出现。一切编译和链接正常。但是,当我尝试使用调试器单步执行函数时,它会显示错误的代码行

有趣的是,正确的行号与调试器显示的行号之间的差异正好是65536。这使我怀疑(几乎可以肯定)一些未签名的短溢出

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


有什么办法可以解决这个问题吗(除了把大文件切成几个小文件之外)?

据微软的一位主持人说,这是一个已知的问题,只有调试器才能解决(正如您所指出的,编译器似乎能很好地处理它)。除了使用较短的源文件外,显然没有其他解决方法。请参阅对非常类似问题的正式答复

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


Edit:正如@valdo所指出的,这仍然不意味着调试器可以在大量行号的情况下正常工作。因此,您必须使用较短的文件。不幸的是,这样的限制是存在的,但即使没有,我仍然建议您拆分源代码

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

您考虑过使用WinDBG吗?它的功能相当强大,因为Windows团队使用它来调试O/s,其中有一些biiiig文件,或者至少在我上次查看时是这样。

好吧,当我想了解sqlite的工作原理时,我将最后60000行左右的代码移到另一个文件中,然后#包含它。这很容易,而且为我做到了。此外,如果您这样做,请注意不要在#ifdef内拆分。

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

为什么要调试sqlite合并?sqlite有一个适当的发行版,有许多独立的文件。如果它没有损坏,就不要合并它。好吧,让我不同意。即使IDiaSession/IDialSession接口是用DWORD参数声明的,但这并不意味着实际的调试信息是用DWORD行号存储的。这个界面可能只是为了支持更大的行号而设计的,不一定是实现的。像这样的编辑可能是对这个问题的评论。这并没有试图回答OP的问题,也没有试图回答OP固有的一般问题。然而,正如我所说的,这似乎是调试信息格式的局限性,而不是调试程序中的一些错误。这篇文章说(除了将巨大的文件切割成几个较小的文件)。这篇文章确实这么说,但建议修改海报的先决条件或假设是完全可以的。将文件分为三个部分(现在合并有超过2*2^16行需要)是真正问题的完美解决方案,即使用符号调试器调试成SQLite代码。我只需要自己做这件事(为什么?因为我需要找出原因,在SQLite文档中没有记录,在我能找到的其他地方也没有提及,某个SQLite函数失败了;我在5分钟内发现了)。