我正在使用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.c
和foo2.c
),您可能需要几天时间才能执行以下操作(因为需要一些人工工作):
首先,缩进 C 代码(也许删除前面的#line
指令)。你可以使用 GNU 缩进。你会得到一个 C 文件,其中函数被明确分隔(它们的主体在第 1 列中有一个大括号)。
将#include
行foo.c
复制并粘贴到foo1.c
和foo2.c
中。巧妙地复制(所以花点时间理解它们)全局变量(可能逐字复制到foo1.c
中,并在foo2.c
中extern
。对于静态变量,这需要一些工作:您将重命名它们(可能具有足够唯一的前缀)以使它们"全局"。因此,foo.c
中的static int sv;
在foo1.c
中变得int myfooprefix_sv;
,在foo2.c
中extern int myfooprefix_sv;
。当然,之后您需要一个#define sv myfooprefix_sv
(在两个文件中)。静态函数需要类似的工作,因此static void dothat(int);
变得void myfooprefix_dothat(int);
后跟#define dothat myfooprefix_dothat
等。
最后,复制并粘贴函数定义,因此函数的前半部分进入foo1.c
函数的后半部分进入foo2.c
尝试编译获得的程序。编辑foo1.c
和foo2.c
以修复编译和链接错误。
这种手动(但累人)的拆分过程通常有效。是的,这需要一些时间。有些病理情况下,这不起作用(但通常生成的 C 文件在这种情况下不会落下)。