Как получить трассировку стека в Windows без использования dbghelp.dll? - PullRequest
7 голосов
/ 25 декабря 2008

Как получить трассировку стека адресов в Windows без использования dbghelp.dll?

Мне не нужно знать, какие символы или имена функций связаны с адресами, я просто хочу список адресов - что-то похожее на обратный след * nix систем ,

Спасибо!

Ответы [ 3 ]

9 голосов
/ 25 декабря 2008

Проверьте функцию CaptureStackBackTrace () , которая находится в Kernel32.dll. Это должно делать все, что вам нужно.

Захватывает трассировку стека, поднимаясь по стеку и записывая информацию для каждого кадра.

USHORT WINAPI CaptureStackBackTrace(
  __in       ULONG FramesToSkip,
  __in       ULONG FramesToCapture,
  __out      PVOID *BackTrace,
  __out_opt  PULONG BackTraceHash
);
2 голосов
/ 25 декабря 2008

Если вы хотите сделать это крайне не переносимым, вы можете просто прочитать регистр EBP и самостоятельно пройтись по стеку. Это будет работать только для архитектуры x86, а также предполагает, что используемая среда выполнения C правильно инициализирует EBP в 0 перед вызовом первой функции.

uint32_t read_ebp(void)
{
    uint32_t my_ebp;
    __asm
    {
        mov ebp, my_ebp
    }

    return my_ebp;
}

void backtrace(void)
{
    uint32_t ebp = read_ebp();

    printf("backtrace:\n");

    while(ebp != 0)
    {
        printf("0x%08x\n", ebp);
        ebp = ((uint32_t *)ebp)[1];
    }
}
1 голос
/ 19 марта 2009

Предыдущий вариант у меня не работает (msvc 6), поэтому:

unsigned long prev;
unsigned long addr;
__asm { mov prev, ebp }
while(addr!=0) { 
  addr = ((unsigned long *)prev)[1]; 
  printf("0x%08x\n", addr); 
  prev = ((unsigned long *)prev)[0]; 
}
Адам, спасибо за то, что выделили путь!
...