读书人

VC编译器DEBUG模式有关问题请问

发布时间: 2012-03-13 11:21:11 作者: rapoo

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楼的方法应该可以得到真正的函数地址

读书人网 >VC/MFC

热点推荐