У меня есть общий объект, написанный на C ++, в котором его функции вызываются различными приложениями, большинство из которых — OpenEdge (Progress).
Есть ли способ определить внутри .so, какая программа вызывала его, не отправляя его в качестве параметра из вызывающей программы?
Для этого есть функциональные возможности в Linux, OSX и Windows.
Для Linux и OSX вы захотите поиграть с функцией backtrace (3). Из документации по Linux:
backtrace () возвращает backtrace для вызывающей программы в массиве
указывает на буфер. Обратный след — это серия активных в данный момент
вызовы функций для программы. Каждый элемент в массиве, на который указывает
буфер имеет тип void * и является адресом возврата из
соответствующий кадр стека.
А для Windows есть CaptureStackBackTrace. Это требует XP или выше, однако.
На GitHub также есть обходной путь, называемый c-callstack, если ни один из них не работает должным образом. Макро-функции заменяют ответные вызовы и дают вам стек вызовов, с которым вы можете работать. Пример использования будет примерно таким:
#include "c-callstack.h"
int foobar(...)
{
if (error/exception)
NL_RETURN(-1);
-function body-
NL_RETURN(0);
}
Вы можете найти файл .h в этом GitHub репозиторий:
Надеюсь, что эти ссылки помогли! Как всегда, вы можете обратиться к нашей Базе знаний, если чувствуете, что проблема, которую вы испытываете / дело, которое вы тестируете, выходит за рамки ваших файлов .so.