Отладка очень большого файла с VS Studio - PullRequest
0 голосов
/ 25 октября 2018

Я использую VS Studio 2015 для отладки очень большого файла из 415797 строк, написанных на C. Проблема в том, что после 84990-й строки отладчик потерял трек файла, я просто больше не могу нажимать F10.Строки до 84990 получают отладочный шарик точки останова, заполненный красным (доступный).Строки после 84990, мяч заполнен белым («Точка останова в настоящее время не будет достигнута»).Двоичный файл занимает около 100 МБ, а файл .pdb - только 5 МБ.Он не генерирует полный файл .pdb.Что может происходить?

Этот вопрос не помог мне.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Обратите внимание, что большой сгенерированный C-файл все еще может быть разбит на несколько частей (с некоторой работой), если у вас нет одиночных огромных функций (например, какой-то одной функции с сотней тысяч строк).Поэтому я расширяю ответ dbush ниже.

Также, возможно, вы могли бы попробовать использовать систему Linux (если ваш сгенерированный файл C и программа легко переносимы в Linux).В Linux / x86-64, с недавним компилятором gcc и недавним отладчиком gdb, я смог отладить сгенерированный C-файл 2MLOC (со многими небольшими функциями, каждая из которых содержит несколько тысяч строк).Вам может понадобиться 32 гигабайта оперативной памяти.Возможно, даже MinGW можно использовать в Windows (я думаю, он также может обрабатывать большие файлы C).

Чтобы разбить сгенерированный файл C foo.c на несколько частей (например, foo1.c иfoo2.c), вам может потребоваться несколько дней, чтобы выполнить следующее (поскольку требуется некоторая человеческая работа):

сначала сделайте отступ в коде C (возможно, удалив директивы #line ранее).Вы можете использовать GNU indent .Вы получаете файл C, в котором функции четко разграничены (их тело имеет фигурную скобку в столбце 1).

Скопируйте и вставьте #include строки foo.c в foo1.c и foo2.c.Умно скопируйте (поэтому потратьте время на их понимание) глобальные переменные (возможно, дословно в foo1.c и с extern в foo2.c. Для статических переменных, которые требуют некоторой работы: вы бы переименовали их (возможно, с достаточно уникальнымпрефикс), чтобы сделать их "глобальными". Таким образом, static int sv; в foo.c становится int 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.c и вторая половина функций в foo2.c

Попробуйте скомпилировать полученную программу. Отредактируйте foo1.c и foo2.c, чтобы исправить ошибки компиляции и компоновки.

Такое руководство (но утомительная процедура расщепления обычно работает. Да, это займет некоторое время. Есть патологические случаи, когда это не работает (но обычно генерируемые файлы C не попадают в такие случаи).

0 голосов
/ 25 октября 2018

Разделение файла на управляемые части было бы лучшим вариантом действий здесь.

Файл размером более 415 тыс. Строк слишком велик, чтобы с ним можно было эффективно работать как с инструментальной точки зрения (как вы узнали), так и с человеческой точки зрения.Вероятно, существует множество функций, которые не связаны напрямую друг с другом и не должны находиться в одном файле.Вопрос, который вы упомянули, упомянул, что размер файла не должен превышать 64 КБ, что означает, что вы хотите создать как минимум 8 отдельных исходных файлов, возможно, больше.

Выясните, какие функции логически связаны друг с другом, и выделите каждый набор связанныхфункции в свой собственный исходный файл, и создайте заголовочный файл для каждого с объявлениями тех, которые должны быть доступны для других модулей.Затем включите эти заголовочные файлы в соответствующие исходные файлы, чтобы к ним можно было получить доступ.

...