Перехват глобальных функций с помощью Valgrind в Linux с использованием g ++ - PullRequest
4 голосов
/ 20 февраля 2011

Я пытаюсь перехватить функцию с помощью Valgrind, согласно их примеру .

Я могу перехватывать глобальные функции при сборке с помощью gcc, однако, когда я компилирую тот же код с g ++, перехват не работает.

Есть ли что-то особенное в флагах компилятора, которые я должен указать?

Вот мой пример приложения:

#include <stdio.h>
#include "valgrind.h"

__attribute__ ((noinline))
void foo()
{
    printf("inside foo\n");
}

void I_WRAP_SONAME_FNNAME_ZU(NONE,foo)()
{
   OrigFn fn;
   VALGRIND_GET_ORIG_FN(fn);
   printf("*** Before foo()\n");
   CALL_FN_v_v(fn);
   printf("*** After foo()\n");
}

int main()
{
    foo();
    return 0;
}

При компиляции с GCC вывод:

*** Before foo()
inside foo
*** After foo()

Однако при компиляции с g ++ вывод просто

внутри фу

1 Ответ

1 голос
/ 22 февраля 2011

G ++ выполняет искажение имени для функции без extern "C".Поэтому вы должны найти искаженное имя (например, с nm object) и использовать его в своем коде valgrind.Или вы можете переписать вашу целевую программу для использования функции extern "C".

...