URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1375
[ Назад ]

Исходное сообщение
"Узнать адрес текущей функции."

Отправлено David , 09-Фев-03 22:28 
Подскажите, плиз, как узнать адрес (или точку входа - кажется это одно и тоже) текущей функции, не зная при этом её названия. Т.е.:
int foo ()
{
  void *self;
  self = // ну и здесь забрать адрес функции foo, не используя при этом имя "foo"
  return 0;
}

Заранее спасибо.


Содержание

Сообщения в этом обсуждении
"RE: Узнать адрес текущей функции."
Отправлено Booter , 09-Фев-03 23:37 
>Подскажите, плиз, как узнать адрес (или точку входа - кажется это одно
>и тоже) текущей функции, не зная при этом её названия. Т.е.:

ИМХО, здесь надо рыть в сторону указателя на функцию... Хотя и в этом случае без имени никак. А что за задачка-то?


"RE: Узнать адрес текущей функции."
Отправлено David , 10-Фев-03 03:34 
>ИМХО, здесь надо рыть в сторону указателя на функцию... Хотя и в
>этом случае без имени никак. А что за задачка-то?

Задачка такая - я пытаюсь написать нечто похожее на либу, которая должна будет помогать при отладке многопоточных программ. Адрес функции мне нужен для того, чтобы точно идентифицировать функцию (имена могут быть и одинаковые). А имя использовать нежелательно, т.к. разпознавание будет прооисходить в универсальном макросе. О варианте передавать имя функции я уже подумал, но не хочется зависеть от случайной ошибки... в общем это не совсем удобно.
У меня всё таки чувство, что должен быть универсальный способ узнать адрес текущей функции.


"RE: Узнать адрес текущей функции."
Отправлено genie , 10-Фев-03 03:45 
esli kompiler - GCC, poprobui __FUNCTION__

>>ИМХО, здесь надо рыть в сторону указателя на функцию... Хотя и в
>>этом случае без имени никак. А что за задачка-то?
>
>Задачка такая - я пытаюсь написать нечто похожее на либу, которая должна
>будет помогать при отладке многопоточных программ. Адрес функции мне нужен для
>того, чтобы точно идентифицировать функцию (имена могут быть и одинаковые). А
>имя использовать нежелательно, т.к. разпознавание будет прооисходить в универсальном макросе. О
>варианте передавать имя функции я уже подумал, но не хочется зависеть
>от случайной ошибки... в общем это не совсем удобно.
>У меня всё таки чувство, что должен быть универсальный способ узнать адрес
>текущей функции.



"RE: Узнать адрес текущей функции."
Отправлено David , 10-Фев-03 04:37 
>esli kompiler - GCC, poprobui __FUNCTION__
>
спасибо, это очень удобная вещь, но это всё равно не то. __FUNCTION__ возвращает название текущей функции в виде строки(!) :(((. Я знаю как в макросе преобразовать инструкцию в строку, но наоборот....

Кстати, люди, а как брать адрес функции, если известно её название?
&foo (без скобок)
Я правильно понимаю?


"RE: Узнать адрес текущей функции."
Отправлено Booter , 10-Фев-03 06:11 
>>esli kompiler - GCC, poprobui __FUNCTION__
>>
>спасибо, это очень удобная вещь, но это всё равно не то. __FUNCTION__
>возвращает название текущей функции в виде строки(!) :(((. Я знаю как
>в макросе преобразовать инструкцию в строку, но наоборот....
>
>Кстати, люди, а как брать адрес функции, если известно её название?
>&foo (без скобок)
>Я правильно понимаю?

Ну, тут маленький нюансик - макрос отдает имя функции при компилляции, подцепить к готовому коду уже не получится. Советую спереть gdb в исходниках и посмотреть, как это делается там. Скорее всего просто отступом на n-отсчетов от текушего местоположения.



"RE: Узнать адрес текущей функции."
Отправлено David , 10-Фев-03 12:41 
>Ну, тут маленький нюансик - макрос отдает имя функции при компилляции, подцепить
>к готовому коду уже не получится. Советую спереть gdb в исходниках
>и посмотреть, как это делается там. Скорее всего просто отступом на
>n-отсчетов от текушего местоположения.

Да, подцепить действительно не удаётся.
А это в gdb точно есть?
А как текущее положение узнать, если только не через ассемблер?
Может кто знает как через asm всё это дело организовать?


"RE: Узнать адрес текущей функции."
Отправлено Booter , 10-Фев-03 15:17 
>>Ну, тут маленький нюансик - макрос отдает имя функции при компилляции, подцепить
>>к готовому коду уже не получится. Советую спереть gdb в исходниках
>>и посмотреть, как это делается там. Скорее всего просто отступом на
>>n-отсчетов от текушего местоположения.
>
>Да, подцепить действительно не удаётся.
>А это в gdb точно есть?

Ну, скажем так, для подцепление gdb тоже требуется скомпиллировать исходный код вместе с символьными таблицами. Если же этого не было - все решается грязным хаком.

>А как текущее положение узнать, если только не через ассемблер?

По большому счету - никак. Как действуют дебагеры с breakpoint-ами - берется однобайтовая команда, генерирующая определенное прерывание. Код, на который прерывание ставится, запоминается и меняется на эту команду. При прохождении этой команды процессор перепрыгнет на прерывание, которое и восстановит код операции. Но это в real-mode. В protected есть регистры отладки, которыми и следует баловаться. Но и в том, и в другом случае нужен адрес... :)

>Может кто знает как через asm всё это дело организовать?



"RE: Узнать адрес текущей функции."
Отправлено vnp , 10-Фев-03 21:37 
>>Ну, тут маленький нюансик - макрос отдает имя функции при компилляции, подцепить
>>к готовому коду уже не получится. Советую спереть gdb в исходниках
>>и посмотреть, как это делается там. Скорее всего просто отступом на
>>n-отсчетов от текушего местоположения.
>
>Да, подцепить действительно не удаётся.
>А это в gdb точно есть?
>А как текущее положение узнать, если только не через ассемблер?
>Может кто знает как через asm всё это дело организовать?

gdb, как и всякий отладчик, смотрит на т.н. отладочную информацию (см.
флаг -g компилятора). Собственно gdb переть не обязательно; все интересное
происходит в binutils/bfd. Предварительно почитать описание elf (или coff
или a.out, в зависимости от нужд), для ориентации в bfd.


"RE: Узнать адрес текущей функции."
Отправлено genie , 11-Фев-03 04:58 
Ne-a, nepravil'no. Poprobui poigraisya s dlsym() - Win32 podderzhivaet GetProcAddress dlya tekucschego processa, mozhet i dlsym() takoe dast sdelat' (chto-nibud' tipa dlsym(NULL,__FUNCTION__).

Esche odna vozmozhnost' - eto poigrat'sya s EBP - on hranit original'nyi SP - po nemu nahoditsya adres vyzova funkcii, a ottuda - sam adres funkcii.

>>esli kompiler - GCC, poprobui __FUNCTION__
>>
>спасибо, это очень удобная вещь, но это всё равно не то. __FUNCTION__
>возвращает название текущей функции в виде строки(!) :(((. Я знаю как
>в макросе преобразовать инструкцию в строку, но наоборот....
>
>Кстати, люди, а как брать адрес функции, если известно её название?
>&foo (без скобок)
>Я правильно понимаю?



"RE: Узнать адрес текущей функции."
Отправлено Nekto , 15-Фев-03 21:58 
>Ne-a, nepravil'no. Poprobui poigraisya s dlsym() - Win32 podderzhivaet GetProcAddress dlya tekucschego
>processa, mozhet i dlsym() takoe dast sdelat' (chto-nibud' tipa dlsym(NULL,__FUNCTION__).
>
>Esche odna vozmozhnost' - eto poigrat'sya s EBP - on hranit original'nyi
>SP - po nemu nahoditsya adres vyzova funkcii, a ottuda -
>sam adres funkcii.
>
>
>
>>>esli kompiler - GCC, poprobui __FUNCTION__
>>>
>>спасибо, это очень удобная вещь, но это всё равно не то. __FUNCTION__
>>возвращает название текущей функции в виде строки(!) :(((. Я знаю как
>>в макросе преобразовать инструкцию в строку, но наоборот....
>>
>>Кстати, люди, а как брать адрес функции, если известно её название?
>>&foo (без скобок)
>>Я правильно понимаю?

а про PTRACE забыли ? :)
А исходнички посмотреть ..

gdb уже свободно и непринужденно трэйсит многопотоковые программы ..
задачка ваша ненужна ..


"RE: Узнать адрес текущей функции."
Отправлено David , 16-Фев-03 16:02 
>а про PTRACE забыли ? :)
>А исходнички посмотреть ..

спасибо, посмотрю.

>gdb уже свободно и непринужденно трэйсит многопотоковые программы ..
>задачка ваша ненужна ..

мне не нужен пошаговый отладчик, в достаточно сложной системе он мало чем может помочь, я пытаюсь сделать инструмент, который будет показывать всё, происходящее в каждом потоке отдельно и в плане взаимодействия друг с другом. Так что задачка (по крайней мере мне) очень даже нужна.
Впрочем проблему уникальной идентификации функции я решил простым сочетанием __FILE__ , __LINE__ и __FUNCTION__


"RE: Узнать адрес текущей функции."
Отправлено DPX , 19-Фев-03 18:13 
Как вызов функции работает знаешь? ;)
Покопай в сторону технологии срыва стека,
примеры кода найди - там это /почти это/ используется :))))
Не сможешь разобраться - пиши в мыло,
так и быть уж, подскажу....