Идея assert состоит в том, чтобы выполнить sh вашу программу, если определенное условие не выполнено, с использованием SIGABRT, поэтому она делает именно то, что должна делать в этом случае.
Прежде всего, я настоятельно рекомендуем вам реорганизовать этот код, поскольку он нечитабелен, и это усложняет понимание ошибки - невозможно понять , что делает этот код с первого взгляда.
Во-вторых, если вы работаете с linux, утверждения вызовут дамп ядра, который представляет собой файл, содержащий состояние памяти программы при ее сбое. С этим дампом ядра вы можете заглянуть в последний момент программы, используя инструмент под названием GDB (GNU debugger). Это не самый красивый, но мощный.
Другой правильный способ - добавить распечатки (или логи) в ваш код, чтобы вы могли видеть, что происходит, и почему вы получаете утверждение.
Наконец, assert - это инструмент, предназначенный для документирования вашего инварианта вашего кода и обеспечения того, чтобы всякий раз, когда этот инвариант больше не был корректным (из-за ошибки или неправильного использования ваш код), программа сразу же взломает sh, сообщая об ошибке как можно скорее.