LINUX.ORG.RU

Как заставить GDB построить трассу программы ?


0

0

Имеется программа на Си. Например 

fact(int x) {

 int f = 1;

 while ( x > 1) {
   f = f * x;
   x = x - 1;
  }  

  return f;
}

main() {
   return fact(3);
}

Хотелось бы для заранее выбранных функций построить трассу их 
выполнения, содержащую все срабатывания операторов присваивания. Например, для функции fact(x) хотелось бы иметь что-то вроде

fact(x), при x = 3 : 
f = 1
f = f * x
x = x - 1
f = f * x
x = x - 1

Полагаю, что такое удобно сделать средствами GDB. Только в GDB я особо не разбираюсь. В какую сторону копать ? 
★★


Ну вот не с помощью gdb, а с помощью dbx:

$cc -g tr.c

$dbx ./a.out
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.7' in your .dbxrc
Reading a.out
Reading ld.so.1
Reading libc.so.1
(dbx) trace next -in fact
(2) trace next -in fact
(dbx) run | grep =
trace: 3 int f = 1;
trace: 6 f = f * x;
trace: 7 x = x - 1;
trace: 6 f = f * x;
trace: 7 x = x - 1;

dbx брать тут:

http://developers.sun.com/sunstudio/downloads/express/

anonymous
()
Ответ на: комментарий от anonymous

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

Burbaka ★★
() автор топика
Ответ на: комментарий от anonymous

>а с помощью dbx:

За пинок в нужную сторону - респект

anonymous
()
Ответ на: комментарий от Burbaka

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

или может help tracepoint поможет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.