Walking the callstack

2023-11-11 00:08
文章标签 walking callstack

本文主要是介绍Walking the callstack,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Walking the callstack

作者:Jochen Kalmbach

翻译:Hefe

原文出处:www.codeproject.com

关键字:callstack, StackWalker

简介

有些情况下,我们需要显示当前线程的callstack,或是显示其他我们感兴趣的进程或线程的callstack,为此,我专门写了这篇文章阐述如何获得callstack

我写这篇文章的主要目的如下:

1, 提供一些简单的接口来生成callstack

2, 基于CPP的特性提供一些方法来用于重载

3, 隐藏具体API的实现

4, Callstack信息默认输出在debug模式窗口(可以自己定制输出方式)

5, 支持用户提供的内存只读函数

6, 编译器支持VC5-VC8

7, 提供最便利的callstack生成方案

背景

目前MS已经提供API(StackWalker64)用来遍历callstack。从win9x/w2k开始,这个接口就被包含在dbghelp.dll的库中(NT上,取而代之的是imagehelp.dll),只是这个接口(StackWalk64)w2k之后被改名字了,在w2k之前叫StackWalk,没有尾巴的64。这个工程只支持最新的Xxx64接口,如果你想在比较旧的平台上运行,你可以去下载支持相关的平台dll

最新版本的dbghelp.dll可以和windbg一起下载(译者注:windbgMS发布的一款调试工具,当你下载并安装的时候,相应的安装目录下会有dbghelp.dll文件)。同时也包含了symsrv.dll文件,这个文件主要用来激活MS的公共符号服务(这个服务主要用来获取系统文件的调试信息)

如何使用代码

StackWalker这个类的使用非常简单。比如:如果你想获得当前线程的callstack,你只需要初始化一个StackWalk的实例,然后调用ShowCallStack即可。(译者注:一般我们需要继承StackWalker这个类,然后声明并初始化这个子类的实例)。

代码演示1

#include <windows.h>
#include "StackWalker.h"
 
void Func5() { StackWalker sw; sw.ShowCallstack(); }
void Func4() { Func5(); }
void Func3() { Func4(); }
void Func2() { Func3(); }
void Func1() { Func2(); }
 
int main()
{
  Func1();
  return 0;
}

debug-output窗口生成相应的输出如下:

[...] (output stripped)
d:/privat/Articles/stackwalker/stackwalker.cpp (736): StackWalker::ShowCallstack
d:/privat/Articles/stackwalker/main.cpp (4): Func5
d:/privat/Articles/stackwalker/main.cpp (5): Func4
d:/privat/Articles/stackwalker/main.cpp (6): Func3
d:/privat/Articles/stackwalker/main.cpp (7): Func2
d:/privat/Articles/stackwalker/main.cpp (8): Func1
d:/privat/Articles/stackwalker/main.cpp (13): main
f:/vs70builds/3077/vc/crtbld/crt/src/crt0.c (259): mainCRTStartup
77E614C7 (kernel32): (filename not available): _BaseProcessStart@4

你现在可以双击任意一行,VS会自动的跳转到你想到的文件并定位到具体行。

定制你自己的输出结构

如果你想直接把callstack输出到文件或是使用其他的输出结构(译者注:比如英雄岛项目中就是ITrace*),你只需要继承StackWalker类即可。你有两种选择来实现自己的输出结构:1,重写OnOutput方法。2,重写所有的OnXXX函数。当然从OO的思想来说,第一种方法是推荐的,符合KISS的原则。

演示代码2
class MyStackWalker : public StackWalker
{
public:
  MyStackWalker() : StackWalker() {}
protected:
  virtual void OnOutput(LPCSTR szText)
     { printf(szText); StackWalker::OnOutput(szText); }
};

这篇关于Walking the callstack的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386200

相关文章

uva 825 Walking on the Safe Side(动态规划:记忆化搜索)

题目的输入太蛋疼了... 题目本身倒是不难 代码如下: #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 1010using namespace std;char str[MAXN];int a[MAXN][MAXN], dp[MAXN][MAXN];i

UVA 10913 - Walking on a Grid (记忆化搜索)

题目链接~~> 做题感悟:开始不用标记数组把 dp 数组初始化一下用于标记但是这样因为初始化的原因就超时了,改为标记数组才过。 解题思路:记忆化搜索                 这题很明显,如果用递推的方法的话必定不好写,因为在一行里可以向左做可以向右走,这样就导致不好递推,如果用记忆化方法的话就很好写了,如果单纯的只向右和下的话可以用三维标记 dp[ i ] [ j ] [ k ] (

sky walking日志采集以及注意事项

文章目录 1,sky walking日志采集功能概述2,采集log4j2日志3,采集logback日志4,效果展示5,注意事项 1,sky walking日志采集功能概述 在介绍Sky walking日志采集功能之前,最好在系统学习一遍日志框架,这里推荐楠哥的日志框架 在实际项目中我们需要将项目中的日志采集到sky walking中以便于我们能够快速排查问题,sky walkin

分布式链路追踪工具Sky walking详解

1,为什么要使用分布式链路追踪工具 随着分布式系统和微服务架构的出现,且伴随着用户量的增加,项目的体量变得十分庞大,一次用户请求会经过多个系统,不同服务之间调用关系十分复杂,一旦一个系统出现错误都可能会影响整个请求的处理结果。而因为项目十分庞大,调用链路十分复杂,无法快速定位失败的位置和原因。 除此之外,复杂的分布式系统也面临如下问题: 性能分析:一个服务依赖很多,被依赖的服务也依赖其他服务。

通过超分辨率像素引导的Scribble Walking和逐类对比正则化的弱监督医学图像分割(SC-Ne)论文速读

目录 Weakly Supervised Medical Image Segmentation via Superpixel-Guided Scribble Walking and Class-Wise Contrastive Regularization摘要方法实验结果 Weakly Supervised Medical Image Segmentation via Super

2020小米网络赛第一场 Walking Machine(BFS)

题意: 每个点有一个方向值,代表这个点出发只能走这个方向。 求多少个点出发可以走到棋盘外。 思路: 经典题了吧,直接从外边界bfs进来看能遍历到多少个点。当然遍历的时候我们要记得把每个点的方向值反一下。 #include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>usi

uva 10913 Walking on a Grid

原题: You will be given a square grid of size N × N. The top-left square has a coordinate of (1, 1) and that of bottom-right is (N,N). Your job is to walk from (1, 1) to (N,N). Very easy, right? Thats

Educational Codeforces Round 50 (Rated for Div. 2) B. Diagonal Walking v.2(思维)

题目链接:http://codeforces.com/contest/1036/problem/B 题意:给你一个q代表q次询问,然后给出三个数n,m, k。(n,m)代表终点,k代表最多移动的步数。让你求出到达终点的过程中,走对角线的最大步数。 思路:当m > k时输出-1(设m是较大的数),当m-n是奇数时有一步不能走对角线所以k--,当走对角线可以直接到达终点,如果剩余的步数是奇数则有两

walking机器人仿真教程-应用-多点导航实现办公室内取件和配送

系列文章目录 walking机器人仿真教程-启动仿真环境walking机器人仿真教程-查看仿真环境相关话题walking机器人仿真教程-仿真控制walking机器人仿真教程-激光建图-仿真slam_toolbox算法建图walking机器人仿真教程-激光建图-仿真gmapping算法建图walking机器人仿真教程-激光建图-仿真cartographer算法建图walking机器人仿真教程

walking机器人仿真教程-应用-多点导航实现咖啡店内配送

系列文章目录 walking机器人仿真教程-启动仿真环境walking机器人仿真教程-查看仿真环境相关话题walking机器人仿真教程-仿真控制walking机器人仿真教程-激光建图-仿真slam_toolbox算法建图walking机器人仿真教程-激光建图-仿真gmapping算法建图walking机器人仿真教程-激光建图-仿真cartographer算法建图walking机器人仿真教程