C: Получить все переменные, определенные в текущей области - PullRequest
3 голосов
/ 18 апреля 2011

Этот вопрос задавался ранее для других языков: Python , PHP и JavaScript .

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

РЕДАКТИРОВАТЬ
Снимок может быть списком всех переменных в области видимости и их текущим значением.Я мог бы написать это вручную, но я хотел бы знать, есть ли более быстрый способ сделать что-либо.

Ответы [ 4 ]

10 голосов
/ 18 апреля 2011

Да и нет

Есть ли языковая функция? Нет.

Можно ли это сделать независимо от системы? Нет.

Есть ли простой способ? Нет.

Может ли это быть сделано системно-специфическим способом с некоторыми усилиями? Да.

Таким образом, нет хорошего и легкого пути, но если вы действительно этого хотите, это можно сделать.Вообще говоря, программа скомпилирована для отладки, а затем вы открываете файл изображения во время выполнения и выясняете, какие переменные существуют и где они хранятся.Скорее всего, практический способ сделать это - написать сценарий отладчика, такого как gdb, и позволить ему выполнять низкоуровневую работу.

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

Другая возможность: некоторые операционные системы поддерживают библиотечную функцию, которая читает таблицу символов.В Historic Unix и Mac OS X есть nlist (3). В некоторых версиях Linux и Solaris есть dlinfo (3). Инструмент CLI , называемый nm (1) (вы можете popen (1) it) общедоступно.

0 голосов
/ 20 апреля 2011

Не просто. Вам нужно было бы сделать это на двоичном уровне и знать, куда ваш компилятор поместил структуры данных относительно базового указателя в оборудовании. Вам также понадобятся символы отладки.

Короткий ответ - нет, не без значительных усилий.

0 голосов
/ 18 апреля 2011

В зависимости от программы C, которая вас интересует, вы можете использовать Frama-C, в частности, полностью развернутый анализ значений , для имитации выполнения, а затем вставить вызов Frama_C_dump_each(), чтобы получить дамп значений переменных в определенной точке программы.

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

Пример:

int x,a;
int y=2;

void f(void)
{
  int lf = 5;
  a = y + 2;
  Frama_C_dump_each();
  return;
}

main(){
  int lmain = 3;
  f();
  return 0;
}

$ frama-c -val -slevel 50000 t.c
....
[value] DUMPING STATE of file t.c line 8
    x ∈ {0; }
    a ∈ {4; }
    y ∈ {2; }
    lf ∈ {5; }
    lmain ∈ {3; }
    =END OF DUMP==
....
0 голосов
/ 18 апреля 2011

Вы просто не можете сделать это на (скомпилированном) языке, который настолько низкоуровневый.Когда компилятор + компоновщик завершают работу с вашим кодом, остается мало «переменных», только необработанный машинный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...