Стратегия, которую я бы использовал, точно такая же, как и вы. Удалите как можно больше кода, пока проблема не исчезнет, затем добавьте последний бит обратно и отладьте его.
Однако, возможно, это не ваш код виноват. Следует обратить внимание на одну вещь: мы обнаружили эту проблему в AIX, и даже если вы работаете в Windows, она может быть похожей.
У нас была сторонняя библиотека, которая динамически загружала другую разделяемую библиотеку, которая в своей процедуре инициализации настраивала функцию atexit, которая будет вызываться при выходе из процесса.
Однако по мере того, как наше приложение загружает и выгружает эти общие библиотеки, к моменту завершения процесса функции atexit общей библиотеки уже не было в памяти, и мы сбросили ядро.
Это проявляется как нарушение прав доступа после возврата из main(), поэтому, если это то, что происходит с вами, это почти наверняка то же самое. Код запуска C RTL будет проходить по списку atexit и вызывать каждую из его функций, независимо от того, что вы с ними сделали.
Конечно, если он падает до выхода из main(), то это спорный вопрос.
Одна вещь, которую вы могли бы рассмотреть (и мы фактически сделали это однажды после анализа затрат и выгод от отслеживания и исправления особенно сложной ошибки): отправьте отладочную версию как свой продукт. Если это не сбой, это может быть быстрым решением, позволяющим выпустить продукт, пока вы работаете над более приемлемым решением на досуге.
person
paxdiablo
schedule
18.12.2008