-
-
[原创]堆栈跟踪DEMO[vc6源码]
-
发表于:
2012-3-20 16:13
11635
-
#include <stdio.h>
#include "ade_asm.h"
int chk_addr_ret(void* addr)
{
char* op_asm = (char*)addr;
disasm_struct dis_op;
/* 执行反汇编,直到返回指令 */
while (!IsBadCodePtr((FARPROC)op_asm)
&& ade32_disasm(op_asm, &dis_op) > 0) {
if (dis_op.disasm_flag & C_STOP)
return op_asm - (char*)addr;
op_asm += dis_op.disasm_len;
}
return 0;
}
void do_stack_trace(void* __ebp)
{
int frame_size;
/* 执行堆栈回溯 */
do {
void* ret_addr = *((void**)__ebp + 1);
void** fun_addr = (void**)__ebp + 1;
frame_size = *(char**)__ebp - (char*)__ebp;
printf("frame:%p ret_addr %p\n", __ebp, ret_addr);
/* 从ebp堆栈位置向上搜索地址 */
while (fun_addr++ < *(void***)__ebp){
if (chk_addr_ret(*fun_addr) > 0) {
printf("frame:%p ?ret_addr %p\n", __ebp, *fun_addr);
}
}
__ebp = *(void**)__ebp;
} while (frame_size >= 8 && frame_size <= 65535);
}
int fun3(int p1, int p2, int p3)
{
void* __ebp = &__ebp + 1;
__asm mov __ebp, ebp;
do_stack_trace(__ebp);
return 3;
}
int fun2(int p1, int p2)
{
int p = p1 + p2;
return fun3(p, 3, 3);
}
int fun1(int p1)
{
p1 = p1 * p1;
fun2(p1, 2);
return 0;
}
int main(int argc, char** argv)
{
fun1(1);
printf("----stack trace done! press any key to exit!-----\n");
getchar();
return 0;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!