DLL中的函数如何获取调用者信息?

EasyTDD 2008-06-20 09:21:10
DLL中的函数:
void DLLFunc();

调用者:

void caller1()
{
DllFunc();
}

void caller2()
{
DllFunc();
}

void caller3()
{
caller1();
}

有没有办法在DllFunc()中编写代码,了解到底是哪个函数调用了自己?
...全文
267 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuzl32 2008-06-20
  • 打赏
  • 举报
回复

#include <windows.h>
#include <stdio.h>
#include <dbghelp.h>

#pragma comment( lib, "dbghelp.lib" )

void dump_callstack( CONTEXT *context )
{
STACKFRAME sf;
memset( &sf, 0, sizeof( STACKFRAME ) );

sf.AddrPC.Offset = context->Eip;
sf.AddrPC.Mode = AddrModeFlat;
sf.AddrStack.Offset = context->Esp;
sf.AddrStack.Mode = AddrModeFlat;
sf.AddrFrame.Offset = context->Ebp;
sf.AddrFrame.Mode = AddrModeFlat;

DWORD machineType = IMAGE_FILE_MACHINE_I386;

HANDLE hProcess = GetCurrentProcess();
HANDLE hThread = GetCurrentThread();

for( ; ; )
{
if( !StackWalk(machineType, hProcess, hThread, &sf, context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 ) )
{
break;
}

if( sf.AddrFrame.Offset == 0 )
{
break;
}
BYTE symbolBuffer[ sizeof( SYMBOL_INFO ) + 1024 ];
PSYMBOL_INFO pSymbol = ( PSYMBOL_INFO ) symbolBuffer;

pSymbol->SizeOfStruct = sizeof( symbolBuffer );
pSymbol->MaxNameLen = 1024;

DWORD64 symDisplacement = 0;
if( SymFromAddr( hProcess, sf.AddrPC.Offset, 0, pSymbol ) )
{
printf( "Function : %s\n", pSymbol->Name );
}
else
{
printf( "SymFromAdd failed!\n" );
}

IMAGEHLP_LINE lineInfo = { sizeof(IMAGEHLP_LINE) };
DWORD dwLineDisplacement;

if( SymGetLineFromAddr( hProcess, sf.AddrPC.Offset, &dwLineDisplacement, &lineInfo ) )
{
printf( "[Source File : %s]\n", lineInfo.FileName );
printf( "[Source Line : %u]\n", lineInfo.LineNumber );
}
else
{
printf( "SymGetLineFromAddr failed!\n" );
}
}
}

DWORD excep_filter( LPEXCEPTION_POINTERS lpEP )
{
/**//// init dbghelp.dll
if( SymInitialize( GetCurrentProcess(), NULL, TRUE ) )
{
printf( "Init dbghelp ok.\n" );
}

dump_callstack( lpEP->ContextRecord );

if( SymCleanup( GetCurrentProcess() ) )
{
printf( "Cleanup dbghelp ok.\n" );
}

return EXCEPTION_EXECUTE_HANDLER;
}

void func1( int i )
{
int *p = 0;
*p = i;
}

void func2( int i )
{
func1( i - 1 );
}

void func3( int i )
{
func2( i - 1 );
}

void test( int i )
{
func3( i - 1 );
}

int main()
{
__try
{
test( 10 );
}
__except( excep_filter( GetExceptionInformation() ) )
{
printf( "Some exception occures.\n" );
}
return 0;
}


编译需要禁用优化,并添加调试信息

cmd > cl Client.cpp /Od /Zi

output:
Init dbghelp ok.
Function : func1
[Source File : e:\client.cpp]
[Source Line : 87]
Function : func2
[Source File : e:\client.cpp]
[Source Line : 92]
Function : func3
[Source File : e:\client.cpp]
[Source Line : 97]
Function : test
[Source File : e:\client.cpp]
[Source Line : 102]
Function : main
[Source File : e:\client.cpp]
[Source Line : 109]
Function : __tmainCRTStartup
[Source File : f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c]
[Source Line : 318]
Function : GetCommandLineW
SymGetLineFromAddr failed!
Cleanup dbghelp ok.
Some exception occures.
iambic 2008-06-20
  • 打赏
  • 举报
回复
当你想这么做的时候,往往是想错了。
yuzl32 2008-06-20
  • 打赏
  • 举报
回复
StackWalk64
  • 打赏
  • 举报
回复
查看栈中的信息.
9527他大爷 2008-06-20
  • 打赏
  • 举报
回复
传参数..........
.
iu_81 2008-06-20
  • 打赏
  • 举报
回复
或者GetCommandLine
iu_81 2008-06-20
  • 打赏
  • 举报
回复
应该在封装一下
如fun(string caller)
{
DllFunc();
cout<<caller;
}

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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