69,371
社区成员
发帖
与我相关
我的任务
分享
void fpub (int x, float y) {/* …… */}
void f1 (void) {fpub(1, 1.0f);}
void f2 (void) {fpub(1, 1.0f);}
void f3 (void) {fpub(1, 1.0f);}
int main (void) {f1 (); f2 (); f3 (); fpub (2,2.0f); return 0;}
现在,我们希望在fpub内部获取并打印调用者的名字,则可以将fpub改为fpub_new,将原来的fpub改为宏,其它任何东西都不用变:
void fpub_new (int x, float y, const char * s) {/* …… */; __builtin_printf ("%s\n", s);}
# define fpub(m, n) fpub_new (m, n, __func__)
void f1 (void) {fpub (1, 1.0f);}
void f2 (void) {fpub (1, 1.0f);}
void f3 (void) {fpub (1, 1.0f);}
int main (void) {f1 (); f2 (); f3 (); fpub (2,2.0f); return 0;}
#include <stdio.h>
void whocallme();
void fun1() {
whocallme();
}
void fun2() {
whocallme();
}
void fun3() {
fun1();
}
void whocallme() {
int *_esp,i;
__asm {
mov eax,esp
mov _esp,eax
}
printf("\nfun1,fun2,fun3,_esp=%08x,%08x,%08x,%08x\n",(int)fun1,(int)fun2,(int)fun3,(int)_esp);
for (i=0;i<100;i++) if (_esp[i]==(int)_esp) break;
if (i<100) {
printf("ret addr=%08x\n",_esp[i+2]);
if ((int)fun1<=_esp[i+2] && _esp[i+2]<(int)fun2) printf("fun1 callme\n");
if ((int)fun2<=_esp[i+2] && _esp[i+2]<(int)fun3) printf("fun2 callme\n");
}
}
void main() {
fun2();
fun1();
}
//C:\tmp\tmp\Debug>tmp
//
//fun1,fun2,fun3,_esp=00401000,00401020,00401040,0012fe84
//ret addr=0040102e
//fun2 callme
//
//fun1,fun2,fun3,_esp=00401000,00401020,00401040,0012fe84
//ret addr=0040100e
//fun1 callme
//
//C:\tmp\tmp\Debug>cd ..\release
//
//C:\tmp\tmp\Release>tmp
//
//fun1,fun2,fun3,_esp=00401000,0040100a,00401014,0012ff5c
//ret addr=00401012
//fun2 callme
//
//fun1,fun2,fun3,_esp=00401000,0040100a,00401014,0012ff5c
//ret addr=00401008
//fun1 callme
//
#include <stdio.h>
#define call(fn) call_fn(fn, __FUNCTION__)
typedef void (*FUNC_A)();
void call_fn(FUNC_A fn, const char * caller_name)
{
printf("called from [%s]: ", caller_name);
fn();
}
void a()
{
printf("I'm func a.\n");
}
#define a() call_fn(a, __FUNCTION__)
void b()
{
call(a);
}
void c()
{
a(); //
}
void d()
{
call(c);
}
int main(int argc, char **argv)
{
a();
b();
c();
d();
return 0;
}
输出结果:
called from [main]: I'm func a.
called from [b]: I'm func a.
called from [c]: I'm func a.
called from [d]: called from [c]: I'm func a.
#include <stdio.h>
#define call(fn) call_fn(fn, __FUNCTION__)
typedef void (*FUNC_A)();
void call_fn(FUNC_A fn, const char * caller_name)
{
printf("called from [%s]: ", caller_name);
fn();
}
void a()
{
printf("I'm func a.\n");
}
void b()
{
call(a);
}
void c()
{
call(a);
}
void d()
{
call(a);
}
int main(int argc, char **argv)
{
b();
c();
d();
return 0;
}