Подскажите, плиз, как узнать адрес (или точку входа - кажется это одно и тоже) текущей функции, не зная при этом её названия. Т.е.:
int foo ()
{
void *self;
self = // ну и здесь забрать адрес функции foo, не используя при этом имя "foo"
return 0;
}Заранее спасибо.
>Подскажите, плиз, как узнать адрес (или точку входа - кажется это одно
>и тоже) текущей функции, не зная при этом её названия. Т.е.:ИМХО, здесь надо рыть в сторону указателя на функцию... Хотя и в этом случае без имени никак. А что за задачка-то?
>ИМХО, здесь надо рыть в сторону указателя на функцию... Хотя и в
>этом случае без имени никак. А что за задачка-то?Задачка такая - я пытаюсь написать нечто похожее на либу, которая должна будет помогать при отладке многопоточных программ. Адрес функции мне нужен для того, чтобы точно идентифицировать функцию (имена могут быть и одинаковые). А имя использовать нежелательно, т.к. разпознавание будет прооисходить в универсальном макросе. О варианте передавать имя функции я уже подумал, но не хочется зависеть от случайной ошибки... в общем это не совсем удобно.
У меня всё таки чувство, что должен быть универсальный способ узнать адрес текущей функции.
esli kompiler - GCC, poprobui __FUNCTION__>>ИМХО, здесь надо рыть в сторону указателя на функцию... Хотя и в
>>этом случае без имени никак. А что за задачка-то?
>
>Задачка такая - я пытаюсь написать нечто похожее на либу, которая должна
>будет помогать при отладке многопоточных программ. Адрес функции мне нужен для
>того, чтобы точно идентифицировать функцию (имена могут быть и одинаковые). А
>имя использовать нежелательно, т.к. разпознавание будет прооисходить в универсальном макросе. О
>варианте передавать имя функции я уже подумал, но не хочется зависеть
>от случайной ошибки... в общем это не совсем удобно.
>У меня всё таки чувство, что должен быть универсальный способ узнать адрес
>текущей функции.
>esli kompiler - GCC, poprobui __FUNCTION__
>
спасибо, это очень удобная вещь, но это всё равно не то. __FUNCTION__ возвращает название текущей функции в виде строки(!) :(((. Я знаю как в макросе преобразовать инструкцию в строку, но наоборот....Кстати, люди, а как брать адрес функции, если известно её название?
&foo (без скобок)
Я правильно понимаю?
>>esli kompiler - GCC, poprobui __FUNCTION__
>>
>спасибо, это очень удобная вещь, но это всё равно не то. __FUNCTION__
>возвращает название текущей функции в виде строки(!) :(((. Я знаю как
>в макросе преобразовать инструкцию в строку, но наоборот....
>
>Кстати, люди, а как брать адрес функции, если известно её название?
>&foo (без скобок)
>Я правильно понимаю?Ну, тут маленький нюансик - макрос отдает имя функции при компилляции, подцепить к готовому коду уже не получится. Советую спереть gdb в исходниках и посмотреть, как это делается там. Скорее всего просто отступом на n-отсчетов от текушего местоположения.
>Ну, тут маленький нюансик - макрос отдает имя функции при компилляции, подцепить
>к готовому коду уже не получится. Советую спереть gdb в исходниках
>и посмотреть, как это делается там. Скорее всего просто отступом на
>n-отсчетов от текушего местоположения.Да, подцепить действительно не удаётся.
А это в gdb точно есть?
А как текущее положение узнать, если только не через ассемблер?
Может кто знает как через asm всё это дело организовать?
>>Ну, тут маленький нюансик - макрос отдает имя функции при компилляции, подцепить
>>к готовому коду уже не получится. Советую спереть gdb в исходниках
>>и посмотреть, как это делается там. Скорее всего просто отступом на
>>n-отсчетов от текушего местоположения.
>
>Да, подцепить действительно не удаётся.
>А это в gdb точно есть?Ну, скажем так, для подцепление gdb тоже требуется скомпиллировать исходный код вместе с символьными таблицами. Если же этого не было - все решается грязным хаком.
>А как текущее положение узнать, если только не через ассемблер?
По большому счету - никак. Как действуют дебагеры с breakpoint-ами - берется однобайтовая команда, генерирующая определенное прерывание. Код, на который прерывание ставится, запоминается и меняется на эту команду. При прохождении этой команды процессор перепрыгнет на прерывание, которое и восстановит код операции. Но это в real-mode. В protected есть регистры отладки, которыми и следует баловаться. Но и в том, и в другом случае нужен адрес... :)
>Может кто знает как через asm всё это дело организовать?
>>Ну, тут маленький нюансик - макрос отдает имя функции при компилляции, подцепить
>>к готовому коду уже не получится. Советую спереть gdb в исходниках
>>и посмотреть, как это делается там. Скорее всего просто отступом на
>>n-отсчетов от текушего местоположения.
>
>Да, подцепить действительно не удаётся.
>А это в gdb точно есть?
>А как текущее положение узнать, если только не через ассемблер?
>Может кто знает как через asm всё это дело организовать?gdb, как и всякий отладчик, смотрит на т.н. отладочную информацию (см.
флаг -g компилятора). Собственно gdb переть не обязательно; все интересное
происходит в binutils/bfd. Предварительно почитать описание elf (или coff
или a.out, в зависимости от нужд), для ориентации в bfd.
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 (без скобок)
>Я правильно понимаю?
>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 уже свободно и непринужденно трэйсит многопотоковые программы ..
задачка ваша ненужна ..
>а про PTRACE забыли ? :)
>А исходнички посмотреть ..спасибо, посмотрю.
>gdb уже свободно и непринужденно трэйсит многопотоковые программы ..
>задачка ваша ненужна ..мне не нужен пошаговый отладчик, в достаточно сложной системе он мало чем может помочь, я пытаюсь сделать инструмент, который будет показывать всё, происходящее в каждом потоке отдельно и в плане взаимодействия друг с другом. Так что задачка (по крайней мере мне) очень даже нужна.
Впрочем проблему уникальной идентификации функции я решил простым сочетанием __FILE__ , __LINE__ и __FUNCTION__
Как вызов функции работает знаешь? ;)
Покопай в сторону технологии срыва стека,
примеры кода найди - там это /почти это/ используется :))))
Не сможешь разобраться - пиши в мыло,
так и быть уж, подскажу....