Ну сушествуют внутрение механизмы. Например макрос assert из assert.h. В дебаг режиме, если аргумент макроса true то программа продолжает работать, при аргументе false программа прерывается с выводом в консоль строчки, в которой произошел вылет.
Простой пример:
char *ch=NULL;
assert(ch);
При выполнении выдает ошибку main.cpp:73 int main(): Assertion 'ch' failed.
Если заметил, выдается не только имя файла но и имя самой функции и номер строки в файле.
Теперь, когда делается релиз версия, то все assert игнорируются. Поэтому не рекомендуют делать важные для программы вычисления или вызовы функций в теле assert.