Если ваша программа украшена операторами assert, то каждый оператор assert определяет допустимое состояние. Программные операторы между утверждениями определяют действительные изменения состояния.
Программа, которая аварийно завершает работу, нарушила достаточно утверждений о том, что что-то сломалось.
Программа, которая неверна, но "ненадежна", нарушила хотя бы одно утверждение, но не провалилась.
Не совсем понятно, что вы ищете. Допустимые состояния - иногда - трудно определить, но - обычно - легко представить в виде простых assert
утверждений.
Поскольку сбойная программа нарушила одно или несколько утверждений, программе с явными исполняемыми утверждениями не требуется отладка при сбое. Это просто провалит утверждение утверждения и заметно умрет.
Если вы не хотите помещать утверждения assert, тогда по существу невозможно узнать, какое состояние должно быть истинным и какое (никогда не заявленное) утверждение было нарушено.
Разматывание стека вызовов для определения положения, и вложение является тривиальным. Но не ясно, что это показывает. Он говорит вам, что сломалось, но не то, что другие вещи ведут к поломке. Это потребовало бы угадать, какие утверждения, где предполагалось, были правдой, что требует глубокого знания дизайна.
Edit.
«кажутся связанными» и «кажутся несвязанными» недопустимы без обращения к фактическому дизайну фактического приложения и фактическим утверждениям, что должно быть верным в каждом кадре стека.
Если вы не знаете, что должно быть верным, все, что у вас есть, - это случайная лужа переменных. Что вы можете утверждать о «связанных», учитывая случайную кучу значений?
Crash 1: a = 2, b = 3, c = 4
Crash 2: a = 3, b = 4, c = 5
Относящиеся? Unrelated? Как вы можете классифицировать их, не зная всего о коде? Если вы знаете все о коде, вы можете сформулировать стандартные условия assert
утверждения, что должно быть true. И тогда вы знаете, что такое настоящий сбой.