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



我正在使用VS Studio 2015来调试一个用C编写的415797行的非常大的文件。问题是在第 84990 行之后,调试器丢失了文件的跟踪,我再也按不了 F10 了。84990 之前的行将调试断点球填充为红色(可访问)。84990 之后的行,球为白色填充("断点当前不会被命中。二进制文件约为 100MB,.pdb文件仅为 5MB。它不会生成完整的.pdb文件。可能会发生什么?

这个问题对我没有帮助。

将文件拆分为可管理的部分将是这里最好的做法。

超过 415K 行的文件太大了,无法有效地使用,无论是从工具的角度来看(正如您所发现的)还是从人类的角度来看。 可能有很多彼此没有直接关系的函数不需要位于同一个文件中。 您链接的问题提到将大小保持在 64K 以下,因此这意味着您正在考虑制作至少 8 个单独的源文件,可能更多。

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

请注意,一个生成的大型 C 文件仍然可以拆分为几个部分(有一些工作),只要你没有单个巨大的函数(例如,一些有十万行的单个函数)。所以我在下面扩展了dbush的答案。

另外,也许你可以尝试使用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 缩进。你会得到一个 C 文件,其中函数被明确分隔(它们的主体在第 1 列中有一个大括号)。

#includefoo.c复制并粘贴到foo1.cfoo2.c中。巧妙地复制(所以花点时间理解它们)全局变量(可能逐字复制到foo1.c中,并在foo2.cextern。对于静态变量,这需要一些工作:您将重命名它们(可能具有足够唯一的前缀)以使它们"全局"。因此,foo.c中的static int sv;foo1.c中变得int myfooprefix_sv;,在foo2.cextern int myfooprefix_sv;。当然,之后您需要一个#define sv myfooprefix_sv(在两个文件中)。静态函数需要类似的工作,因此static void dothat(int);变得void myfooprefix_dothat(int);后跟#define dothat myfooprefix_dothat等。

最后,复制并粘贴函数定义,因此函数的前半部分进入foo1.c函数的后半部分进入foo2.c

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

这种手动(但累人)的拆分过程通常有效。是的,这需要一些时间。有些病理情况下,这不起作用(但通常生成的 C 文件在这种情况下不会落下)。

最新更新