Если вы хотите получать уведомления только о конкретных функциях, вы можете сделать это следующим образом:
компилировать с отладочной информацией (поскольку у вас уже есть символьная информация, у вас, вероятно, также достаточно отладок)
данный
#include <iostream>
int fac(int n) {
if(n == 0)
return 1;
return n * fac(n-1);
}
int main()
{
for(int i=0;i<4;i++)
std::cout << fac(i) << std::endl;
}
Используйте GDB для трассировки:
[js@HOST2 cpp]$ g++ -g3 test.cpp
[js@HOST2 cpp]$ gdb ./a.out
(gdb) b fac
Breakpoint 1 at 0x804866a: file test.cpp, line 4.
(gdb) commands 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>silent
>bt 1
>c
>end
(gdb) run
Starting program: /home/js/cpp/a.out
#0 fac (n=0) at test.cpp:4
1
#0 fac (n=1) at test.cpp:4
#0 fac (n=0) at test.cpp:4
1
#0 fac (n=2) at test.cpp:4
#0 fac (n=1) at test.cpp:4
#0 fac (n=0) at test.cpp:4
2
#0 fac (n=3) at test.cpp:4
#0 fac (n=2) at test.cpp:4
#0 fac (n=1) at test.cpp:4
#0 fac (n=0) at test.cpp:4
6
Program exited normally.
(gdb)
Вот что я делаю, чтобы собрать все адреса функций:
tmp=$(mktemp)
readelf -s ./a.out | gawk '
{
if($4 == "FUNC" && $2 != 0) {
print "# code for " $NF;
print "b *0x" $2;
print "commands";
print "silent";
print "bt 1";
print "c";
print "end";
print "";
}
}' > $tmp;
gdb --command=$tmp ./a.out;
rm -f $tmp
Обратите внимание, что вместо простой печати текущего кадра (bt 1
), вы можете делать все, что угодно, печатать значение некоторого глобала, выполнять какую-либо команду оболочки или отправлять что-либо по почте, если оно попадает в функцию fatal_bomb_exploded
:) К сожалению , gcc выводит некоторые сообщения «Текущий язык изменен» между ними. Но это легко сгладить. Ничего страшного.