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