使用VS Studio调试非常大的文件

时间:2018-10-25 18:24:03

标签: c visual-studio debugging visual-studio-2015

我正在使用VS Studio 2015调试用C编写的415797行的非常大的文件。问题是,在第84990行之后,调试器丢失了文件的踪迹,我只是无法再按F10键。 84990之前的行会获得调试断点球,并用红色填充(必填)。在84990之后的行中,球被填充为白色(“当前不会击中断点。”)。二进制文件约为100MB,.pdb文件仅为5MB。它没有生成完整的.pdb文件。可能会发生什么?

这个question对我没有帮助。

2 个答案:

答案 0 :(得分:1)

将文件拆分为可管理的部分将是此处的最佳做法。

从工具的角度(如您所知)和从人的角度来看,超过41.5万行的文件太大,无法有效使用。可能有很多彼此不直接相关的功能,不需要在同一文件中。您所链接的问题提到将大小保持在64K以下,因此这意味着您正在考虑制作至少8个单独的源文件,甚至可能更多。

找出哪些函数在逻辑上属于同一函数,并将每组相关的函数分解为自己的源文件,并为每个函数创建一个头文件,并声明需要其他模块访问的函数。然后将这些头文件包含在相关的源文件中,以便可以对其进行访问。

答案 1 :(得分:1)

请注意,只要您没有单个巨大的函数(例如,一个具有十万行的单个函数),仍然可以将生成的大型C文件拆分为几部分(需要做一些工作)。因此,我在下面展开dbush's answer

此外,也许您可​​以尝试使用Linux系统(如果您生成的C文件和程序很容易移植到Linux)。在Linux / x86-64上,使用最新的gcc编译器和最新的gdb调试器,我已经能够调试2MLOC生成的C文件(具有许多小功能,每个功能少于几千行) )。您可能需要32 GB的RAM。甚至MinGW都可以在Windows上使用(我想它也可以处理大型C文件)。

要将生成的C文件foo.c分成几段(例如foo1.cfoo2.c),您可能需要几天时间来执行以下操作(因为需要一些人工工作) :

首先,缩进C代码(可能之前删除了#line指令)。您可以使用GNU indent。您会得到一个C文件,其中的功能明确界定(它们的主体在第1列中有一个大括号)。

#include的{​​{1}}行复制并粘贴到foo.cfoo1.c中。巧妙地复制(因此花一些时间来理解)全局变量(可能逐字复制到foo2.c中,并在foo1.c中复制extern。对于静态变量,需要做一些工作:您需要重命名它们(可能具有足够唯一的前缀)以使其成为“全局”。因此foo2.c中的static int sv;变成{{1}中foo.cint myfooprefix_sv;中的foo1.c }}。当然,这之后您需要在两个文件中同时使用extern int myfooprefix_sv;。静态功能也需要类似的工作,因此foo2.c变成#define sv myfooprefix_sv,后跟static void dothat(int);

最后,您复制并粘贴了函数定义,因此,函数的前半部分进入void myfooprefix_dothat(int);,而函数的后半部分进入#define dothat myfooprefix_dothat

尝试编译获得的程序。编辑foo1.cfoo2.c,以修复编译和链接错误。

通常可以执行这种手动(但很累)的拆分过程。是的,这需要一些时间。在某些病理情况下,这些方法不起作用(但通常不会在这种情况下生成C文件)。