The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Узнать адрес текущей функции."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Узнать адрес текущей функции."
Сообщение от genie emailИскать по авторуВ закладки on 10-Фев-03, 03:45  (MSK)
esli kompiler - GCC, poprobui __FUNCTION__

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

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

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "RE: Узнать адрес текущей функции."
Сообщение от genie emailИскать по авторуВ закладки on 11-Фев-03, 04:58  (MSK)
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 (без скобок)
>Я правильно понимаю?


  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "RE: Узнать адрес текущей функции."
Сообщение от Nekto emailИскать по авторуВ закладки on 15-Фев-03, 21:58  (MSK)
>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 уже свободно и непринужденно трэйсит многопотоковые программы ..
задачка ваша ненужна ..

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "RE: Узнать адрес текущей функции."
Сообщение от DPX emailИскать по авторуВ закладки on 19-Фев-03, 18:13  (MSK)
Как вызов функции работает знаешь? ;)
Покопай в сторону технологии срыва стека,
примеры кода найди - там это /почти это/ используется :))))
Не сможешь разобраться - пиши в мыло,
так и быть уж, подскажу....
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру