VC编译器DEBUG模式问题请教
我在写DLL的时候,发现DEBUG模式下调用某个自己的函数时总是会跳到一个jmp指令处,再由jmp转到函数入口。
举例说,有如下函数:
void func1()
{
...
}
int dllmain(...)
{
func1();
...
}
运行到func1时,查看汇编模式,单步进入,发现到了一个jmp指令处,然后再由jmp跳转到函数真正的入口。
而Release下编译就不会有这样的情况,直接转到函数入口执行。
看起来确实没什么大碍,可是如果要读取func1函数的指令码就麻烦了,DEBUG模式下func1得到的是jmp指令的地址,
而非实际入口,这样也就读不到函数的指令码了。
请问有没有办法在DEBUG模式下不产生jmp跳转的编译开关或是其它设置?
或者有没有办法在DEBUG模式下取到函数的真正入口地址?
[解决办法]
如果你能有访问代码的权限,你在debug模式下就能读jmp的地址了,那地址想必就是真正地址。
[解决办法]
你确认通过函数指针获得的地址不是实际的函数地址吗?试过吗?
[解决办法]
调试时会乱跳。
这个问题我碰到过,不清楚怎么解决,但是逻辑等结果没有什么问题。
估计还是调试器的问题。
[解决办法]
- C/C++ code
// test8.cpp : Defines the entry point for the console application.//#include "stdafx.h"int fun1(){ return 0;}int getaddr( void *f ){ // 计算函数真实地址 unsigned char* funaddr = ( unsigned char* )f;//void f(){} unsigned long realaddr = 0; if( 0xe9 == funaddr[ 0 ] )// 判断是否为虚拟函数地址,E9为jmp指令 { realaddr = ( unsigned long )f; realaddr += funaddr[ 2 ] * 0x100 + funaddr[ 1 ] + 5; } else { realaddr = ( unsigned long )f; } return realaddr;} int main(int argc, char* argv[]){ printf( "%X", getaddr( fun1 ) ); return 0;}
[解决办法]
搞得太复杂了吧,修改一下Release的配置,选上调试信息选项,然后用Release来调试。
[解决办法]
project->setting->c/C++修改一个选项.link中打上两个勾。
[解决办法]
Debug模式有jmp是为了将调试信息写在jmp,使其得到执行。
用5楼的方法应该可以得到真正的函数地址