Windows程序运行中有时会出现异常对话框,提示“XX指令访问非法内存”之类的,但是出现异常的DLL是操作系统自身的,比如kernel32.dll或ntdll.dll,根据经验这些问题都是我们自己的程序出了问题导致的,这类问题是否可以根据指令找到DLL中的相应函数?比如提示:"0x77FCB03D"指令引用的"0x00000000"内存。该内存不能为"written"。
能否根据上述提示找到0x77FCB03D指令对应的函数?
能否根据上述提示找到0x77FCB03D指令对应的函数?
解决方案 »
- windows下蓝牙程序设计?
- 求高人帮忙
- 调用动态链接库时出错不知怎么该,请高手帮忙 谢谢
- 谁提供自画 一个进度条控件的源代码(100分)
- 那位大哥告诉我!在程序里控制声音怎么做?前提是不改变系统音量!!谢谢!
- 散分,和大家讨论读了《统一软件开发过程》和《Windows核心编程》
- 求救,如何在Win32,即SDK编程中把_variant_t转换成const char*类型?
- Unhandle Exception in ***.exe(KEDNEL32.DLL):0xE06D7363:Microsoft C++ Exception
- 菜鸟VC问题:这个头文件怎么加进来?
- 请问大家知道那里有流程图制作软件(好像叫Visio)的软件下载吗?我找得好苦啊!
- 求<<MFC Windows程序设计>>
- 呜呜,求救~~~~~~
如果没有安装相关的DBG文件,只根据DLL能否查到0x77FCB03D是哪个函数的?怎么查?
{
return (PGDI_TABLE_ENTRY)*((PULONG)0x77c13000);
}
这样应该是可以的吧?
下午又找到了另一个方法:
TEB *pteb=NULL;
__asm mov eax,fs:[18h]
__asm mov pteb,eax PEB *ppeb=pteb->Peb;
PVOID phddd=ppeb->GdiSharedHandleTable;
dumpbin gdi32.dll /exports 出来的结果是这样的:
ordinal hint RVA name 1 0 00028AA3 AbortDoc
2 1 00028FA9 AbortPath
3 2 00020C61 AddFontMemResourceEx
4 3 0001DF87 AddFontResourceA
5 4 00020B24 AddFontResourceExA
6 5 00020EDA AddFontResourceExW
7 6 00020C94 AddFontResourceTracking
......还是不能知道0x77FCB03D地址的函数。
而且0x77FCB03D地址应该是落在ntdll.dll的范围内,也不应该是gdi32.dll啊?
If you are debugging the release build, you should enable the debug information.
see
http://blog.joycode.com/jiangsheng/archive/2006/02/05/71101.aspx
你有IDA你可以试一下。我这边是2003,所以跟你的地址不一样。
没法告诉你在哪个函数。
to:jiangsheng(蒋晟.Net[MVP])
不需要调试信息,一样能知道是在哪个函数里。
1、美工 1名 软件界面设计
2、网站制作 1名 HTML + JavaScript(PHP)
3、程序员 2名 Win32 API + C\C++
4、数据库管理员 1名 Oracle; SQL Sever 2000
根据dll加载的基地址和导出函数相对地址,可以算出来。怎么算?能否举个实际的例子?
For example:memcpy越界就会造成.
你这个方法只能算出函数CopyFileA的地址,但是现在我的问题是根据地址找对应的函数,你举的例子中如果出错的地址是0x7c830053,那很清楚就是CopyFileA函数,但是如果出错地址是0x7c830000,就很难界定了,而实际情况下一般都是这样,出错的指令地址一般都是很随机的。
或者使用symbols
在Platform SDK > Debugging and Error Handling > Using DbgHelp
在这里有很详细的示例代码,你可以枚举出所有与你exe可执行文件相关的动态库(Module DLL)以及这些动态库中的函数(Function)和符号地址(Symbol Address)。试着将这些信息保存在一个文件ModuleInfo.txt中,当这个exe文件Crash时,你的栈最终定位到0x77FCB03D,并且在Module中你确信这个指向Kernel32.dll,那么,通过ModuleInfo.txt便可以找到0x77FCB03D所指向的函数了,如果找不到,可能是其它错误。