Определение текущей компилируемой функции в VC++
От: Фатыхов михаил Хамитович  
Дата: 12.09.01 11:16
Оценка:
Наверное многие сталкивались с такой проблемой:
Необходимо при компиляции определить что за функция в данный момент компилирируется (например для всевозможных логов ошибок, try...catch, MessageBox и др). Естественно можно написать:
void SomeFunc()
{
#define FUNC_NAME "SomeFunc";
try
{
.
.
.
}
catch(...)
{
MessageBox( 0, "Error in " FUNCNAME, "Error", MB_OK );
}
}

но мягко говоря это напрягает...

Thanks
Re: Определение текущей компилируемой функции в VC++
От: VVV Россия  
Дата: 12.09.01 11:43
Оценка:
Здравствуйте Фатыхов михаил Хамитович, вы писали:

ФМХ>Наверное многие сталкивались с такой проблемой:

ФМХ>Необходимо при компиляции определить что за функция в данный момент компилирируется (например для всевозможных логов ошибок, 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++
От: Фатыхов Михаил Хамитович  
Дата: 12.09.01 12:03
Оценка:
Здравствуйте 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++
От: malloc  
Дата: 13.09.01 11:09
Оценка:
Здравствуйте Фатыхов михаил Хамитович, вы писали:

ФМХ>Наверное многие сталкивались с такой проблемой:

ФМХ>Необходимо при компиляции определить что за функция в данный момент компилирируется (например для всевозможных логов ошибок, 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() }

и в программе:

BEGIN_FUNCTION(int, main, (int argc, char** argv))
//...
END_FUNCTION()

по-другому imho никак
Re[3]: Определение текущей компилируемой функции в VC++
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.09.01 09:07
Оценка:
Здравствуйте Фатыхов Михаил Хамитович, вы писали:

ФМХ>Здравствуйте 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++
От: IT Россия linq2db.com
Дата: 14.09.01 23:18
Оценка:
Здравствуйте 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++
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.01 00:27
Оценка:
Здравствуйте 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++
От: IT Россия linq2db.com
Дата: 15.09.01 00:37
Оценка:
Здравствуйте VladD2, вы писали:

VD>Не! Ну, если нельзя но очень хочется... :)


[skip]

Это понятно, найти решение всегда можно. Но если в программе с десяток исключений разных типов, вложенность процедур тоже не хилая, то на каждую строчку не на'BUG10k'аешся :o)
Хотя, если очень хочется... 8-/
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Определение текущей компилируемой функции в VC++
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.09.01 00:49
Оценка:
Здравствуйте IT, вы писали:

IT>Здравствуйте VladD2, вы писали:


VD>>Не! Ну, если нельзя но очень хочется... :)


IT>[skip]


IT>Это понятно, найти решение всегда можно. Но если в программе с десяток исключений разных типов, вложенность процедур тоже не хилая, то на каждую строчку не на'BUG10k'аешся :o)

IT>Хотя, если очень хочется... 8-/

Да, ну тебя... Не романтик ты. :)

Берешь тачку по круче... и вперед. А BUG10k вставляется так:

открываешь VС (лучше 7.0), открываешь диалог замены, включаешь регэкспы и пишешь:

^
заменить на:

BUG10k;

если студия 7-я, то можно и по файлам в поддиректориях. :)))

Ну, не ставить же BoundChecker? Мы шо, не Ындэйцы шо ли?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Определение текущей компилируемой функции в VC++
От: Snax Россия  
Дата: 15.09.01 01:33
Оценка:
Немного не об том, но я в подобной ситуации использовал ::SetUnhandledExceptionFilter(),
а потом использовал ::StackWalk() + ::SymGetLineFromAddr() для получения конкретной строки.

Павел.
Re[9]: Определение текущей компилируемой функции в VC++
От: IT Россия linq2db.com
Дата: 15.09.01 01:35
Оценка:
Здравствуйте Snax, вы писали:

S>Немного не об том, но я в подобной ситуации использовал ::SetUnhandledExceptionFilter(),

S>а потом использовал ::StackWalk() + ::SymGetLineFromAddr() для получения конкретной строки.

Рабочий код, пжалуста. А то я уже задолбался по 100 строк трассировать ;)
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.