openge — Как ссылаться на вызывающее приложение из общего объекта C ++

У меня есть общий объект, написанный на C ++, в котором его функции вызываются различными приложениями, большинство из которых — OpenEdge (Progress).

Есть ли способ определить внутри .so, какая программа вызывала его, не отправляя его в качестве параметра из вызывающей программы?

1

Решение

Для этого есть функциональные возможности в 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.

База знаний прогресса

1

Другие решения


По вопросам рекламы [email protected]