“确定被调用的宿主问题”各种语言版大征集!

赵4老师 2012-06-06 04:50:26
C语言版:需要尽量简单地设置编译链接选项。VC6
http://topic.csdn.net/u/20120530/05/A9E5E49E-940A-44AE-96A5-A0E7DB986C10.html
#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
//


欢迎大家在下面踊跃给出其它语言版:
...全文
573 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypzhong 2014-11-26
  • 打赏
  • 举报
回复
一道c语言乱码大赛经典之作,不知楼主能否看得懂。 #include <stdio.h> char *a;main(int t,int _,char* a){return!0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13? main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1) :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
ypzhong 2014-11-26
  • 打赏
  • 举报
回复
sorry,,本来是想发到这个贴的,,http://bbs.csdn.net/topics/390935120。。搞错了
ypzhong 2014-11-26
  • 打赏
  • 举报
回复
引用 22 楼 ypzhong 的回复:
一道c语言乱码大赛经典之作,不知楼主能否看得懂。 #include <stdio.h> char *a;main(int t,int _,char* a){return!0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13? main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1) :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
我擦发错了
ouPuso 2012-09-25
  • 打赏
  • 举报
回复
有可移植的例子不?
ioaq 2012-06-16
  • 打赏
  • 举报
回复
看不懂啊,还得继续努力!
「已注销」 2012-06-16
  • 打赏
  • 举报
回复
看到LZ的帖子,我只能说我被雷到了,我每天大部分时间会接触不同平台的汇编语言(至少两种,算法,没办法,不是我想),但我不会想到居然用汇编 ---- 不同平台光改汇编就改死你;这么简单的问题为什么搞得如此的复杂,怪不得外行人都说IT很复杂呢;假设这个程序不是你写的,出问题的函数是客户的(你无法加whocallme)?假设现在不是VC6++呢,用户偏偏喜好GCC呢?。。。
这个帖子已经回复:http://topic.csdn.net/u/20120530/05/a9e5e49e-940a-44ae-96a5-a0e7db986c10.html?seed=1214750586&r=78880293#r_78880293
实际可适用语言不止c/c++;
赵4老师 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
引用 15 楼 的回复:
引用 14 楼 的回复:
引用 3 楼 的回复:
难道除汇编和C以外,别的语言实现不了?

这话说的,显示的是牛X呢还是一叶障目呢?
java/net一行话。

用代码说话!(^_^)

printStackTrace()
[/Quote]
受教了。
huzhan 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
引用 14 楼 的回复:
引用 3 楼 的回复:
难道除汇编和C以外,别的语言实现不了?

这话说的,显示的是牛X呢还是一叶障目呢?
java/net一行话。

用代码说话!(^_^)
[/Quote]
printStackTrace()


赵4老师 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
引用 3 楼 的回复:
难道除汇编和C以外,别的语言实现不了?

这话说的,显示的是牛X呢还是一叶障目呢?
java/net一行话。
[/Quote]
用代码说话!(^_^)
huzhan 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
难道除汇编和C以外,别的语言实现不了?
[/Quote]
这话说的,显示的是牛X呢还是一叶障目呢?
java/net一行话。
昵称很不好取 2012-06-11
  • 打赏
  • 举报
回复
不懂,支持赵老师一个
pathuang68 2012-06-11
  • 打赏
  • 举报
回复
赵大侠一向很牛X
Timmy_Y 2012-06-11
  • 打赏
  • 举报
回复
赵老师发帖,顶起!
赵4老师 2012-06-11
  • 打赏
  • 举报
回复
选优化时如果不想崩的话,会有优化时的写法。只要你理解了思想。
在优化时想执行到特定位置调试的话,在该特定位置插入__asm int3;
cxyOOOO 2012-06-11
  • 打赏
  • 举报
回复
特地来看了下,结果看不明白。

代码是不是在stack backtrace啊,能说明一下么?
是不是换个编译选项,比如优化,代码就崩了,能说明一下为什么吗?
赵4老师 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:

难道除汇编和C以外,别的语言实现不了?


很多语言都可以。

matlab版本,

function whocallme()
try
throw(....);
catch me
me.stack //完整的stack, 包括了 代码的line,函数名称,所在的源文件,
end
end
[/Quote]
学习了。
CandPointer 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

赵老师发帖,顶起!
[/Quote]



CandPointer 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

难道除汇编和C以外,别的语言实现不了?
[/Quote]

很多语言都可以。

matlab版本,

function whocallme()
try
throw(....);
catch me
me.stack //完整的stack, 包括了 代码的line,函数名称,所在的源文件,
end
end


赵4老师 2012-06-07
  • 打赏
  • 举报
回复
难道除汇编和C以外,别的语言实现不了?
过去的我 2012-06-06
  • 打赏
  • 举报
回复
有意思吗
加载更多回复(1)

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧