программно издеваться над функцией - PullRequest
0 голосов
/ 09 декабря 2011

Есть ли способ программно макетировать функцию для встроенного приложения c, работающего на Linux.В приведенном ниже примере я хочу смоделировать main для вызова someBlah вместо someFunc во время выполнения.

#include <stdio.h>

void someFunc( void )
{
    printf("%s():%d\n",__func__,__LINE__);
}

void someBlah( void )
{
    printf("%s():%d\n",__func__,__LINE__);
}

int main(void)
{
    someFunc();
}

Программа будет выполняться из ram в Linux, поэтому текстовый сегмент должен быть изменяемЯ знаю, что GDB работает по некоторой схожей концепции, где местоположения кода точек останова заменяются инструкциями прерывания.

Ответы [ 5 ]

4 голосов
/ 09 декабря 2011

Конечно, просто составьте таблицу указателей на функции.

#define BLAH 0
#define FOO 1
void (*table_function[])(void) = {someBlah, someFoo};

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

Затем вы вызываете функцию, выполняя

table_function[BLAH]();

Если вы хотите поменять местами функцию, просто скажите

table_function[BLAH] = otherBlah;

Кроме того: не делайте этого, если вы не пишете какую-либо среду JIT-компиляции или ВМ, обычно вам не нужны такие конструкции, и если они вам нужны, у вас, вероятно, плохой день архитектуры.

Хотя, если у вас есть опыт в ОО-дизайне, вы можете разрабатывать полиморфные конструкции в С таким способом (игнорируйте это, если это не имеет смысла).

1 голос
/ 16 декабря 2011

Есть несколько насмешливых рамок для C.

На работе у нас был некоторый успех с cgreen , но нам пришлось вносить изменения в его внутренние компоненты. К счастью, он довольно маленький, и его относительно легко расширить. Альтернатива, которая выглядит хорошо, но я не работал, это комбинация Unity и CMock .

По основной теме модульного тестирования встроенного C-кода я настоятельно рекомендую Test Driven Development для Embedded C .

1 голос
/ 10 декабря 2011

Вы всегда можете сделать некоторую часть текстового сегмента модифицируемой с помощью соответствующего вызова mprotect и перезаписать некоторый код своим собственным (например, с помощью генерации машинного кода с помощью libjit, GNU lightning, ... или вручную).

Но использование указателей на функции - более чистый способ сделать это.

Если функции находятся в общей библиотеке, вы можете даже перезаписать ее Таблица связей процедур (см. также спецификацию ABI , которая зависит от архитектуры - вот одна для ARM )

0 голосов
/ 02 августа 2013

Взгляните на CMocka, есть статья о макете на LWN: Модульное тестирование с фиктивными объектами в C

0 голосов
/ 09 декабря 2011

Еще один способ сделать это:

#include <stdio.h>
#define DEBUG

void someFunc( void )
{
#ifndef DEBUG
    printf("%s():%d\n",__func__,__LINE__);
#else
    printf("%s():%d\n",__func__,__LINE__);
#endif
}

int main(void) 
{
    someFunc();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...