C++(MSVC) 下查看call strack trace;查看函数是否被inline

最近写C++程序,,各种不知道错误出在哪一行,即使输出了行号,也没用,因为不知道哪一次调用出的错,程序bug处离调用位置很远,要调程序不得不一行行的调!

后来发现个好东西:
StackWalker(仅限MSVC): http://www.codeproject.com/Articles/11132/Walking-the-callstack
另有GCC版本: http://stackoverflow.com/questions/691719/c-display-stack-trace-on-exception

1、用StackWalker进行调试
从本文的第一链接里或者本文附件下载StackWalker,新建一个工程,直接运行即可看到示例的结果。
结果会被输出到两个地方:
  • 1、控制台,这是由于我们重载了StackWalker类的OnOutput()方法;
  • 2、Visual Studio的Output的debug窗口(debug时直接可见,release时默认显示的是输出为build信息)

下面这张图对应的是debug版本的输出(最后几行),可以看到最后的几行对应函数的调用顺序~

C++(MSVC) 下查看call strack trace;查看函数是否被inline_第1张图片

下面是对应的代码:
C++(MSVC) 下查看call strack trace;查看函数是否被inline_第2张图片


2、用StackWalker查看函数是否被inline
发现这东西除了用来调试bug外,还有一个用途———— 查看函数是否被inline了!
还是刚才的示例程序,改成release版本,输出变成了下面这样——TestCurrentThread,Func2,Func3,Func4都不见了!只剩下Func5!说明那些函数被inline了~

C++(MSVC) 下查看call strack trace;查看函数是否被inline_第3张图片

再来看看使用__forceinline后的效果:
C++(MSVC) 下查看call strack trace;查看函数是否被inline_第4张图片

C++(MSVC) 下查看call strack trace;查看函数是否被inline_第5张图片

你可能感兴趣的:(C++)