Наверное многие сталкивались с такой проблемой:
Необходимо при компиляции определить что за функция в данный момент компилирируется (например для всевозможных логов ошибок, try...catch, MessageBox и др). Естественно можно написать:
void SomeFunc()
{
#define FUNC_NAME "SomeFunc";
try
{
.
.
.
}
catch(...)
{
MessageBox( 0, "Error in " FUNCNAME, "Error", MB_OK );
}
}
но мягко говоря это напрягает...
Thanks
Re: Определение текущей компилируемой функции в VC++
Здравствуйте Фатыхов михаил Хамитович, вы писали:
ФМХ>Наверное многие сталкивались с такой проблемой: ФМХ>Необходимо при компиляции определить что за функция в данный момент компилирируется (например для всевозможных логов ошибок, try...catch, MessageBox и др). Естественно можно написать: ФМХ>void SomeFunc() ФМХ>{ ФМХ>#define FUNC_NAME "SomeFunc"; ФМХ> try ФМХ> { ФМХ>. ФМХ>. ФМХ>. ФМХ> } ФМХ> catch(...) ФМХ> { ФМХ> MessageBox( 0, "Error in " FUNCNAME, "Error", MB_OK ); ФМХ> } ФМХ>}
ФМХ>но мягко говоря это напрягает...
ФМХ>Thanks
есть такие предопределённые макросы
__LINE__ — The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive.
__FILE__ — The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks.
конечно это не имя функции, но по имени файла и номеру строки функцию всегда можно отыскать, к тому же через пару раз Вы будете уже помнить все проблемные места наизусть :) ... для вывода отладочной информации очень удобно использовать OutputDebugString и тулзу для просмотра этого DBGVIEW.EXE — можно скачать с http://www.sysinternals.com/
Re[2]: Определение текущей компилируемой функции в VC++
Здравствуйте VVV, вы писали:
VVV>есть такие предопределённые макросы VVV>__LINE__ — The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive. VVV>__FILE__ — The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks.
__LINE__, __FILE__ — это хорошо, а может кто знает как узнать номер строки в которой произошло исключение? т.е.:
1. try
2. {
3. int a = b / 0;
4. }
5. catch()
6. {
7. // Как мне узнать что исключение произошло именно в строке 3?
7. }
Re: Определение текущей компилируемой функции в VC++
Здравствуйте Фатыхов михаил Хамитович, вы писали:
ФМХ>Наверное многие сталкивались с такой проблемой: ФМХ>Необходимо при компиляции определить что за функция в данный момент компилирируется (например для всевозможных логов ошибок, try...catch, MessageBox и др). Естественно можно написать: ФМХ>void SomeFunc() ФМХ>{ ФМХ>#define FUNC_NAME "SomeFunc"; ФМХ> try ФМХ> { ФМХ>. ФМХ>. ФМХ>. ФМХ> } ФМХ> catch(...) ФМХ> { ФМХ> MessageBox( 0, "Error in " FUNCNAME, "Error", MB_OK ); ФМХ> } ФМХ>}
ФМХ>но мягко говоря это напрягает...
насколько я знаю, аналога Watcom'овскому __FUNCTION__ или gcc'шному __PRETTY_FUNCTION__ в VC нет.
поэтому можно только извратиться, например так:
#define BEGIN_FUNCTION(type, name, args) type name args { const char __FUNCTION__[] = #name;
#define END_FUNCTION() }
Здравствуйте Фатыхов Михаил Хамитович, вы писали:
ФМХ>Здравствуйте VVV, вы писали:
VVV>>есть такие предопределённые макросы VVV>>__LINE__ — The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive. VVV>>__FILE__ — The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks.
ФМХ>__LINE__, __FILE__ — это хорошо, а может кто знает как узнать номер строки в которой произошло исключение? т.е.: ФМХ>1. try ФМХ>2. { ФМХ>3. int a = b / 0; ФМХ>4. } ФМХ>5. catch() ФМХ>6. { ФМХ>7. // Как мне узнать что исключение произошло именно в строке 3? ФМХ>7. }
Так поставь в catch TRACE. В его начале выводи имя файла (__LINE__), а за ним дописывай "(__LINE__)". Тогда можно будет (в VC) переходить к этому месту как к ошибке.
Еще проще поставить ASSERT.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Определение текущей компилируемой функции в VC++
Здравствуйте VladD2, вы писали:
ФМХ>>1. try ФМХ>>2. { ФМХ>>3. int a = b / 0; ФМХ>>4. } ФМХ>>5. catch() ФМХ>>6. { ФМХ>>7. // Как мне узнать что исключение произошло именно в строке 3? ФМХ>>7. }
VD>Так поставь в catch TRACE. В его начале выводи имя файла (__LINE__), а за ним дописывай "(__LINE__)". Тогда можно будет (в VC) переходить к этому месту как к ошибке.
В этом случаее __LINE__ выдаст строку 7, а по условию нужна именно 3. Насколько мне известно, никакого известного науке способа узнать о месте исключения после исключения нет. По крайней мере в отладчике об этом узнать невозможно, так как стек откатывается в обратную сторону.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Определение текущей компилируемой функции в VC++
Здравствуйте IT, вы писали:
IT>Здравствуйте VladD2, вы писали:
ФМХ>>>1. try ФМХ>>>2. { ФМХ>>>3. int a = b / 0; ФМХ>>>4. } ФМХ>>>5. catch() ФМХ>>>6. { ФМХ>>>7. // Как мне узнать что исключение произошло именно в строке 3? ФМХ>>>7. }
VD>>Так поставь в catch TRACE. В его начале выводи имя файла (__LINE__), а за ним дописывай "(__LINE__)". Тогда можно будет (в VC) переходить к этому месту как к ошибке.
IT>В этом случаее __LINE__ выдаст строку 7, а по условию нужна именно 3. Насколько мне известно, никакого известного науке способа узнать о месте исключения после исключения нет. По крайней мере в отладчике об этом узнать невозможно, так как стек откатывается в обратную сторону.
Не! Ну, если нельзя но очень хочется... :)
#ifdef _DEBUG
char g_szSuxxxx[0x100];
#define BUG10k lstrcpy(g_szSuxxxx, __LINE__)
#else //_DEBUG
#define BUG10k
#endif //_DEBUG
//...
1. try
2. {
3. BUG10k; int a = b / 0;
3. BUG10k; int с = b / 0;
3. BUG10k; int в = b / 0;
4. }
5. catch()
6. {
7. // Как мне узнать что исключение произошло именно в строке 3?
8. TRACE(__LINE__); TRACE(g_szSuxxxx); TRACE("\n");
9. }
Прошу строго не судить. :)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Определение текущей компилируемой функции в VC++
Здравствуйте VladD2, вы писали:
VD>Не! Ну, если нельзя но очень хочется... :)
[skip]
Это понятно, найти решение всегда можно. Но если в программе с десяток исключений разных типов, вложенность процедур тоже не хилая, то на каждую строчку не на'BUG10k'аешся :o)
Хотя, если очень хочется... 8-/
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Определение текущей компилируемой функции в VC++
Здравствуйте IT, вы писали:
IT>Здравствуйте VladD2, вы писали:
VD>>Не! Ну, если нельзя но очень хочется... :)
IT>[skip]
IT>Это понятно, найти решение всегда можно. Но если в программе с десяток исключений разных типов, вложенность процедур тоже не хилая, то на каждую строчку не на'BUG10k'аешся :o) IT>Хотя, если очень хочется... 8-/
Да, ну тебя... Не романтик ты. :)
Берешь тачку по круче... и вперед. А BUG10k вставляется так:
Немного не об том, но я в подобной ситуации использовал ::SetUnhandledExceptionFilter(),
а потом использовал ::StackWalk() + ::SymGetLineFromAddr() для получения конкретной строки.
Павел.
Re[9]: Определение текущей компилируемой функции в VC++
Здравствуйте Snax, вы писали:
S>Немного не об том, но я в подобной ситуации использовал ::SetUnhandledExceptionFilter(), S>а потом использовал ::StackWalk() + ::SymGetLineFromAddr() для получения конкретной строки.
Рабочий код, пжалуста. А то я уже задолбался по 100 строк трассировать ;)
Если нам не помогут, то мы тоже никого не пощадим.