根据堆栈跟踪获取唯一ID。快速

时间:2017-01-03 04:52:20

标签: c++ windows stack

此问题基于Very slow stack frames in static library

如何获得此堆栈跟踪的唯一标识?它需要我的记忆管理员:https://github.com/mikelsv/memman

拦截来自openssl库(可能还有其他库)的调用的问题。

问题:

  1. 获取流行堆栈帧的唯一ID。需要:Type *tel = FindType(prevous stack name); tel->allocate count ++;
  2. 获取所有堆栈帧的唯一ID。需要:Stack *sel = FindStack(uniq stack id); sel->allocate count ++;
  3. 当前的解决方案:

    使用CaptureStackBackTrace()其他StackWalk()。但是,CaptureStackBackTrace() - 不要显示所有堆叠帧StackWalk() - 非常慢。

    如何获得更快的唯一标识符堆栈?

    当前代码: https://github.com/mikelsv/msvcore2/blob/master/define/memcon.h

    1. 请参阅GetStackTypeInfo();
    2. 请参阅StackCrc(); - 快速,但计算短筹码。示例:第一个堆栈帧CRYPTO_realloc。此问题:"any calls" -> CRYPTO_realloc()只有一个唯一ID。
    3. 可能的解决方案:

      1. 我可以使用RtlCaptureContext()来获取堆栈帧的唯一ID吗?
      2. 如何使用ebp?

        unsigned long prev;
        unsigned long addr = 1;
        int eframes = 0;
        
        __asm { mov prev, ebp };
        
        while(addr != 0){
            addr = ((unsigned long *)prev)[1]; 
            prev = ((unsigned long *)prev)[0]; 
            stack[eframes] = (void*)addr;
            eframes ++;
        }
        
      3. 这里的问题是:CRYPTO_function_name()调用我的malloc()。在进程中addr == 32768,prev == 2;下一循环中的异常。结果为CaptureStackBackTrace()。如何获得以前的堆栈帧?

        1. 其他快速解决方案?

0 个答案:

没有答案