Желательно(!) что бы эти сообщения не "заводились" через макросы. лучше каким-то статическим объектом или функциями.
Думаю, тут дело как раз в C/C++. Это неуправляемые языки, поэтому все равно придется поработать ручками.
Пишите банальную функцию для записи трейса в файл:
void WriteMyTrace( char*pszTrace, ... ){
  va_list ap;
  FILE*f;
  va_start( ap, pszTrace );
  f = fopen( TRACE_FILE_NAME, "a" );
  vfprintf( f, pszTrace, ap );
  fclose( f );
  va_end( ap );
}
Пишите макрос, который будет ее вызывать:
#define TRACE( fmt, ... ) WriteMyTrace( "%s(%i): "##fmt##"\r\n", __FILE__, __LINE__, __VA_ARGS__ )
И расставляете в своем коде ловушки:
...
if( !something( x, y, z ) ){
  TRACE( "something [%i, %x, %s]", x, y, z );
  return false;
}
if( !something_two( a, b ) ){
  TRACE( "something two [%i]", b - a );
  return false;
}
...
Трейсер готов. Это было не сложно.
На мой взгляд, интереснее был бы вопрос не о сборе трейсов, а 
об инструментах по их анализу, т.к. собрать их для программиста C/C++ - не проблема, за форматом их представления - тоже дело не стоит, а вот правильно понять и найти по ним ошибки, особенно в многопоточных программах - это уже совсем другое дело.