This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Debugging C++ using instrumentation.
- From: "Shriram V" <shriram_vishwanathan at persistent dot co dot in>
- To: <gcc-help at gcc dot gnu dot org>
- Date: Mon, 5 Jul 2004 18:43:41 +0530
- Subject: Debugging C++ using instrumentation.
Hi Gurus,
I was wondering if there is a method that allows a call to an arbitrary
function to be intercepted and replaced by a new function at runtime /
compile-time / link-time.
I am actually writing unit test cases for some classes in my project (C++).
Currently I am forced to write too many stubs for all dependencies and use a
lot of preprocessor directives to get my job done.
This makes testing messy and error prone.
What I want to achieve is provide testing functionality by not changing
anything in the code that is being tested, but if necessary the code could
be instrumented.
For example:
The project contains two classes A and B:
========================
struct A_a_dependency
{
int dfunc(int);
};
struct B_under_test
{
A_a_dependency a1;
int somefunc(int i, int j)
{
if(a1.dfunc(i))
{
return i + j
}
else return 0;
}
};
For testing "B_under_test", I would like a1.dfunc(i) to be replaced by
A_stub::dfunc1(int);
struct A_stub
{
int dfunc1(int)
{
return 1;
}
int dfunc2(int)
{
return 0;
}
};
============
test_func1()
{
A_stub mystub;
//Set up call interceptors and preconditions.
Interceptor Inter(&A_a_dependency::dfunc, &A_stub::dfunc1, &mystub )
B_under_test b;
b.somefunc(10, 20);
//ASSERT postconditions.
}
test_func2()
{
//Set up call interceptors and preconditions.
Interceptor Inter(&A_a_dependency::dfunc, &A_stub::dfunc2, &mystub)
B_under_test b;
b.somefunc(10, 20);
//ASSERT postconditions.
}
===========
I stumbled upon "-finstrument-function" option which would allow me to trace
function calls entry and exit.
But I was not able to use it to modify the execution path.
I also saw "-fall-virtual" option, that would have allowed me to write stub
classes without modifying anything else.
But this option is no longer available with the newer compiler.
I use "g++ (GCC) 3.3.2"
Can anybody help,
Regards,
Shriram.