visual studio能自动生成函数调用关系图吗

rxewe 2012-04-25 10:21:54
从主函数WinMain开始的一层层函数调用关系可以用visual studio自动生成吗?我用的是visual studio 2005
...全文
2130 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
draracle 2012-04-25
  • 打赏
  • 举报
回复
调用堆栈是可以动态捕获的。自己写点代码就可以实现。发段代码给你吧。




HANDLE process = GetCurrentProcess();
HANDLE thread = GetCurrentThread ();

CONTEXT context;
memset( &context, 0, sizeof(context) );
RtlCaptureContext( &context );

STACKFRAME sf;
memset( &sf, 0, sizeof(STACKFRAME) );

#if defined(_AMD64_)

sf.AddrPC.Offset = context.Rip;
sf.AddrPC.Mode = AddrModeFlat;
sf.AddrStack.Offset = context.Rsp;
sf.AddrStack.Mode = AddrModeFlat;
sf.AddrFrame.Offset = context.Rbp;
sf.AddrFrame.Mode = AddrModeFlat;
DWORD machineType = IMAGE_FILE_MACHINE_AMD64;

#elif defined(_IA64_)

sf.AddrPC.Offset = context.Rip;
sf.AddrPC.Mode = AddrModeFlat;
sf.AddrStack.Offset = context.Rsp;
sf.AddrStack.Mode = AddrModeFlat;
sf.AddrFrame.Offset = context.Rbp;
sf.AddrFrame.Mode = AddrModeFlat;
DWORD machineType = IMAGE_FILE_MACHINE_IA64;

#elif defined(_X86_)

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;

#endif

for(;;)
{
#if defined(_AMD64_) || defined(_IA64_)
if( !StackWalk64(machineType, process, thread, &sf, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0) )
{
break;
}
#elif defined(_X86_)
if( !StackWalk (machineType, process, thread, &sf, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0) )
{
break;
}
#endif

if( sf.AddrFrame.Offset == 0 )
{
break;
}

BYTE symbolBuffer[sizeof(SYMBOL_INFO) + 1024];
memset( symbolBuffer, 0, sizeof(symbolBuffer) );

PSYMBOL_INFO pSymbol = reinterpret_cast<PSYMBOL_INFO>( symbolBuffer );
pSymbol -> SizeOfStruct = sizeof( SYMBOL_INFO );
pSymbol -> MaxNameLen = 1024;

if( SymFromAddr(process, sf.AddrPC.Offset, 0, pSymbol) )
{
char temp[64];
sprintf( temp, "0x%X ", pSymbol -> Address );

stack += temp;
if( pSymbol -> Name ){ stack += pSymbol -> Name;
}
stack += "\n";
}
}

gg606 2012-04-25
  • 打赏
  • 举报
回复
偶也想知道
  • 打赏
  • 举报
回复
还有这功能? 怎么用?

[Quote=引用 1 楼 的回复:]

当然可以啊,不过是指针
[/Quote]
jyh_baoding 2012-04-25
  • 打赏
  • 举报
回复
当然可以啊,不过是指针

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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