Выполнение функции на основе события, когда функция возвращается в c, возможно ли это во время выполнения?

проблема, с которой я сталкиваюсь, заключается в том, что некоторые приложения используют библиотеку, которая была создана для включения ведения журнала, мы не можем перекомпилировать код для работающих приложений, поскольку они являются устаревшими приложениями.

поэтому мне нужно добавить функциональность в файл библиотеки и повторно связать исходный код с файлами библиотеки.

функция, определенная в библиотечном файле с именем DEBUG_DATA()

-> возвращает строку имени функции и т. д. -> эта функция уже используется в приложении, что мне нужно сделать, так это выполнить эту функцию DEBUG_DATA. Мне нужно добавить событие и вызвать событие после возврата функции, которая вызывает debug_data.

можно ли создать триггер для события в c, где триггер не вызывается? можно ли это сделать во время выполнения? как в настройке стека?

РЕДАКТИРОВАТЬ: это добавлено в DEBUG_DATA():

void Dynatrace_Method_START(
   const char *ms_FunctionName, const char *ms_FileName, int ms_LineNO)
{
#ifdef DT_USE /*a global variable needs to be initiated for stack trace lets call it int Dyna_M_SERIAL*/
    DT_Current_Stack++;
    if (DT_Current_Stack<=DT_STACK) {
        // FILE_NAME_STRIPPER(ms_FileName);
        Dyna_M_SERIAL++;
        fprintf(pfile,"%d,mstart,%s,%s,%d,%s,%d\r\n",
            Dyna_UID, ms_FunctionName, FILE_NAME_STRIPPER(ms_FileName), ms_LineNO,
            sProgram_‌​name, Dyna_M_SERIAL);
        Line_Reference[Dyna_M_SERIAL]=ms_LineNO;
    }
#endif
}

ОС — Guardian H Series TNS\E, компилятор — Compaq ETK-NSE.


person CK_ONE    schedule 04.09.2013    source источник
comment
Изменение стека может быть обнаружено операционной системой (или антивирусной программой), поскольку вредоносная программа запущена, и ваша программа может быть помечена как вирус или другое вредоносное ПО для взлома.   -  person Some programmer dude    schedule 04.09.2013
comment
Боюсь, я не совсем понял ваш вопрос? Не могли бы вы показать с.т. вы пробовали или объявления интерфейса?   -  person πάντα ῥεῖ    schedule 04.09.2013
comment
Вы можете подключить функцию.   -  person Michael M.    schedule 04.09.2013
comment
Это библиотека (.lib) или библиотека динамической компоновки (.dll)?   -  person Dialecticus    schedule 04.09.2013
comment
Можно ли несколько раз вызывать DEBUG_DATA в функции?   -  person Jarod42    schedule 04.09.2013
comment
Можете ли вы разобрать код DEBUG_DATA? Является ли исправление DLL приемлемым решением?   -  person Michael M.    schedule 04.09.2013
comment
Что вы можете изменить? Вы можете делать то, что хотите, если вместо вызова вашей функции debug_data() вы просто создаете экземпляр объекта, конструктор которого вызывает существующую функцию debug_data(), а деструктор вызывает вашу новую функцию события. (Это возможно для кода C++, а не для C)   -  person nos    schedule 04.09.2013
comment
@Joachim: проблем с антивирусом не будет, поскольку приложения работают на мейнфрейме.   -  person CK_ONE    schedule 04.09.2013
comment
@ Майкл: как подключить функцию?   -  person CK_ONE    schedule 04.09.2013
comment
@Dialecticus: это .tlo, это библиотечная функция для Non Stop KErnel Tandem, gaurdian OS   -  person CK_ONE    schedule 04.09.2013
comment
@ Nos: к сожалению, это только c   -  person CK_ONE    schedule 04.09.2013
comment
Я могу в основном изменить код библиотеки .tlo и перекомпилировать библиотеку, а затем повторно связать ее.   -  person CK_ONE    schedule 04.09.2013
comment
это я добавил к отладочным данным:   -  person CK_ONE    schedule 04.09.2013
comment
void Dynatrace_Method_START(const char *ms_FunctionName, \ const char *ms_FileName, \ int ms_LineNO) { #ifdef DT_USE /* глобальная переменная должна быть инициирована для трассировки стека, давайте назовем ее int Dyna_M_SERIAL*/ DT_Current_Stack++; if (DT_Current_Stack‹=DT_STACK) { // FILE_NAME_STRIPPER(ms_FileName); Dyna_M_SERIAL++; fprintf(pfile,%d,mstart,%s,%s,%d,%s,%d\r\n ,Dyna_UID,ms_FunctionName,FILE_NAME_STRIPPER(ms_FileName),ms_LineNO,sProgram_name,Dyna_M_SERIAL); Line_Reference[Dyna_M_SERIAL]=ms_LineNO; } #endif }   -  person CK_ONE    schedule 04.09.2013
comment
Мне нужно вызвать следующее в конце функции, которая вызвала отладочные данные:   -  person CK_ONE    schedule 04.09.2013
comment
void Dynatrace_Method_END(const char *me_FunctionName, \ const char *me_FileName \) { int me_LineNO; #ifdef DT_USE if (Dyna_M_SERIAL›0) { me_LineNO= Line_Reference[Dyna_M_SERIAL]; //ИМЯ_ФАЙЛА_STRIPPER(me_FileName); fprintf(pfile,%d,исправить,%s,%s,%d,%s,%d\r\n ,Dyna_UID,me_FunctionName,FILE_NAME_STRIPPER(me_FileName),me_LineNO,sProgram_name,Dyna_M_SERIAL); Dyna_M_SERIAL--; } #endif }   -  person CK_ONE    schedule 04.09.2013
comment
в основном он отправляет триггеры в систему мониторинга и измеряет время на другом конце, так или иначе мне нужно вызвать вышеуказанное, когда заканчивается функция, которая вызывает данные отладки.   -  person CK_ONE    schedule 04.09.2013
comment
@ Jarod42: debug_data может вызываться несколько раз, однако в большинстве случаев он вызывается только один раз для каждой функции.   -  person CK_ONE    schedule 04.09.2013
comment
У меня такое чувство, что для ответа потребуется нечто большее, чем просто C/C++. Что это за ОС, что за компилятор? Я думаю, что это требует знания ассемблера для этого конкретного мейнфрейма.   -  person Dialecticus    schedule 04.09.2013
comment
ОС — Guardian H Series TNS\E, компилятор — Compaq ETK -NSE   -  person CK_ONE    schedule 04.09.2013
comment
Относительно подключения функции.... Но вам нужно дождаться одного или нескольких вызовов DEBUG_DATA(), и, поскольку вам нужно дождаться завершения вызывающей функции, этот метод может не быть решением, .   -  person ryyker    schedule 04.09.2013
comment
@Dialecticus - я согласен с вашим утверждением для ответа потребуется нечто большее, чем просто C/C++. Но даже если бы доступ к дизассемблированному коду был бы доступен, как бы это помогло, поскольку он ограничен устаревшим (и неизменяемым) исполняемым кодом?   -  person ryyker    schedule 04.09.2013
comment
@ryyker, в Windows можно перенаправлять вызовы dll, чтобы прокси-функция могла запускать этот код пролога и эпилога. Я не знаю, как это делается, но я уверен, что это выполнимо. Может быть, что-то подобное можно сделать и в этой операционной системе Guardian H, кто знает…   -  person Dialecticus    schedule 04.09.2013
comment
Вы уверены, что DEBUG_DATA() на самом деле является функцией, а не макросом препроцессора? Единственный известный мне способ получить имя исходного файла, имя функции и номер строки — это использовать макросы, такие как __FUNCTION__, __FILE__, __LINE__ и т. д. Поскольку они возвращают значения текущей функции, они обычно заключаются в макросы для которые затем вызывают фактическую функцию отладки. Например, #define DEBUG_DATA() debug_data_func(__FILE__, __FUNCTION__, __LINE__) или просто поработайте со строкой #define DEBUG_DATA() "File: " __FILE__ " Function: " __FUNCTION__ " Line: " __LINE__   -  person David M. Syzdek    schedule 04.09.2013
comment
привет, Дэвид, это функция, которая использует макросы:   -  person CK_ONE    schedule 05.09.2013
comment
#define debug_data(сообщение) \ clib_debug_data(сообщение,ФУНКЦИЯ,ФАЙЛ,СТРОКА)   -  person CK_ONE    schedule 05.09.2013
comment
applogies, вы правы, это макрос препроцессора   -  person CK_ONE    schedule 05.09.2013
comment
В устаревшем коде вы можете заменить вызовы базовой библиотечной функции, используя BINDER, чтобы связать свою собственную функцию с тем же именем. Это может вызвать исходную функцию (вы можете переименовать ее с помощью BINDER). Аналогичная функциональность доступна в среде TNS/E, так как некоторые коммерческие продукты используют ее для прозрачной для приложений репликации данных и безопасности.   -  person Andy Simpson    schedule 05.09.2013
comment
@Andy: если имена функций неизвестны? так что для общего решения, где оно применяется ко всем функциям, которые содержат подвызов известной функции, возможно ли это?   -  person CK_ONE    schedule 05.09.2013
comment
@CK_ONE Если вы хотите перехватывать вызовы известной функции X из общих программ, которые вызывают X, не зная/не заботясь о том, где они вызывают X, то это возможно. Я подозреваю, что я могу упустить уровень косвенности в моем понимании вашего вопроса. Извиняюсь за задержку, несколько недель не работал с SO.   -  person Andy Simpson    schedule 19.09.2013