Язык C: Как возможно, чтобы ваша программа продолжала работать некоторое время после сбоя «assert ()»? - PullRequest
3 голосов
/ 21 октября 2011

В настоящее время я (не спрашиваю, почему: P) реализую свои собственные версии malloc () и free (), и намеренно поместил assert (0) в первую строку free () для текущих целей отладки.

Программа драйвера проверяет случайную последовательность этих malloc () и free (), чтобы проверить правильность моих реализаций.

Однако, когда я запускаю драйвер, оболочка печатает, что«Утверждение« 0 »не удалось», продолжает работать немного дольше, , а затем выводит «Aborted».На самом деле, похоже, что он может даже вызывать malloc () несколько раз между сообщением о сбое подтверждения и, наконец, сообщением о том, что программа была прервана.Я уверен в этом из-за некоторых операторов printf, которые я поместил в код для распечатки определенных переменных в целях отладки.

Я не прошу никакой помощи по реализации malloc () и бесплатно ().Хотелось бы просто знать, что это значит, когда кажется, что программа продолжает работать в течение короткого времени (даже, возможно, вызывая другие пользовательские функции), даже после того, как было подтверждено, что утверждение не выполнено.

Ответы [ 2 ]

7 голосов
/ 21 октября 2011

Если вы видите «утверждение не выполнено», за которым следуют отладочные отпечатки, а затем выход, есть две очевидные возможности.

Во-первых, сообщение о подтверждении и отладочные отпечатки делятся на два разныхбуферизованные выходные потоки (например, stderr и stdout), которые не сбрасываются в том же порядке, в котором они заполняются.

Еще один случай - несколько потоков выполняются с помощью malloc ().

3 голосов
/ 21 октября 2011

Если вы работаете в системе на основе glibc, проблема, вероятно, заключается в том, что fprintf вызывает malloc внутри, а assert, в свою очередь, использует fprintf для вывода сообщения об ошибке подтверждения. Это, конечно, очень плохой дизайн, так как печать сообщений об ошибках из-за нехватки памяти всегда будет терпеть неудачу (среди многих других проблем), но это так ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...