Windbg崩溃转储堆栈跟踪保留每个Over函数

Windbg崩溃转储堆栈跟踪保留每个Over函数,windbg,Windbg,因此,我有一个崩溃转储,并使用WinDbg,我能够得到堆栈跟踪。但是,它似乎会跳过其他所有函数。例如,如果实际代码为: void a() { b(); } void b() { c(); } void c(){} 堆栈跟踪在堆栈帧中有a、c,而不是b。这是预期的行为吗?我可以做些什么来查看整个堆栈跟踪吗?我已经使用命令“kn”查看堆栈跟踪。就像Lieven已经提到的那样。这是一种编译器内联调用函数的情况 我有两个建议: a。如果您可以控制代码和生成环境。生成代码的非优化/调试版本。这将

因此,我有一个崩溃转储,并使用WinDbg,我能够得到堆栈跟踪。但是,它似乎会跳过其他所有函数。例如,如果实际代码为:

void a()
{
  b();
}
void b()
{
  c();
}
void c(){}

堆栈跟踪在堆栈帧中有a、c,而不是b。这是预期的行为吗?我可以做些什么来查看整个堆栈跟踪吗?我已经使用命令“kn”查看堆栈跟踪。

就像
Lieven
已经提到的那样。这是一种编译器内联调用函数的情况

我有两个建议:

a。如果您可以控制代码和生成环境。生成代码的非优化/调试版本。这将确保编译器不会自行内联函数

b。在WinDBG中,您可以在视图-->反汇编下看到反汇编。在这里,您可以看到函数
b()
的代码实际上在
a()
下面的行中。
如果您对程序集调试感到满意,还可以获得局部变量的值:)

编译器可能会优化代码。一个优化是内联方法,这样
call
ret
语句以及所有相关的(
push
pop
等)都将被删除

出于演示目的,我在您的代码中添加了一个
std::cout
语句,我们可以识别该语句,以便完整的代码现在可以读取

#include "stdafx.h"
#include <iostream>

void c()
{
    std::cout <<  "Hello world";
}

void b()
{
    c();
}

void a()
{
    b();
}

int _tmain(int argc, _TCHAR* argv[])
{
    a();
    return 0;
}
演练版本构建 在发布版本中,查看事物是如何变化的。WinDbg命令相同,但找不到方法
c()
b()
a()
std::cout
方法调用已内联到
wmain()

0:000>.symfix e:\debug\symbols
0:000>lm
起始端模块名称
013600 01367000优化器已上线(延期)
...
0:000>ld优化基线
已加载用于优化的符号
0:000>x!C
0:000>x!B
0:000>x!A.
0:000>x!维曼
013612a0优化器在线!wmain(国际,世界卫生组织**)
0:000>bp优化在线!维曼
0:000>bl
0 e 013612A00001(0001)0:***优化在线!维曼
0:000>g
断点0命中
eax=6142f628 ebx=00000000 ecx=0087a6e8 edx=0019def8 esi=00000001 edi=00000000
eip=013612a0 esp=0042f8f8 ebp=0042f934 iopl=0 nv向上ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
我是丁宁!韦曼:
013612a0 8B0D4403601 mov ecx,dword ptr[优化在线!_imp_uuuuuu?coutstd(01363044)]ds:002b:01363044={MSVCP120!std::cout(646c6198)}
0:000>u eip L4
我是丁宁!wmain[e:\…\optimizedinlined.cpp@23]:
013612a0 8B0D4403601 mov ecx,dword ptr[优化在线!\u imp_uu?coutstd(01363044)]

013612a6 e895040000呼叫优化在线!std::operator这与Windbg无关,而是编译器由于优化而删除了该函数。Windbg无法显示不存在的内容。如果您将writeln添加到
b
中,您将看到它出现在stacktrace中。好的,我想可能是这样的。我只是想看看那里的局部变量。当然。你想让我加上哪一个?有什么特别的吗!
0:000> .symfix e:\debug\symbols

0:000> lm
start    end        module name
010d0000 010f3000   OptimizedInlined   (deferred)             
...

0:000> ld OptimizedInlined
Symbols loaded for OptimizedInlined

0:000> x OptimizedInlined!c
010e50c0          OptimizedInlined!c (void)

0:000> bp OptimizedInlined!c

0:000> bl
 0 e 010e50c0     0001 (0001)  0:**** OptimizedInlined!c

 0:000> g
Breakpoint 0 hit
eax=cccccccc ebx=7efde000 ecx=00000000 edx=00000001 esi=00000000 edi=003ffa00
eip=010e50c0 esp=003ff930 ebp=003ffa00 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
OptimizedInlined!c:
010e50c0 55              push    ebp

0:000> u eip L18
OptimizedInlined!c [e:\...\optimizedinlined.cpp @ 8]:
010e50c0 55              push    ebp
010e50c1 8bec            mov     ebp,esp
010e50c3 81ecc0000000    sub     esp,0C0h
010e50c9 53              push    ebx
010e50ca 56              push    esi
010e50cb 57              push    edi
010e50cc 8dbd40ffffff    lea     edi,[ebp-0C0h]
010e50d2 b930000000      mov     ecx,30h
010e50d7 b8cccccccc      mov     eax,0CCCCCCCCh
010e50dc f3ab            rep stos dword ptr es:[edi]
010e50de 6854ca0e01      push    offset OptimizedInlined!`string' (010eca54)
010e50e3 a1e4000f01      mov     eax,dword ptr [OptimizedInlined!_imp_?coutstd (010f00e4)]
010e50e8 50              push    eax
010e50e9 e8c9c1ffff      call    OptimizedInlined!ILT+690(??$?6U?$char_traitsDstdstdYAAAV?$basic_ostreamDU?$char_traitsDstd (010e12b7)
010e50ee 83c408          add     esp,8
010e50f1 5f              pop     edi
010e50f2 5e              pop     esi
010e50f3 5b              pop     ebx
010e50f4 81c4c0000000    add     esp,0C0h
010e50fa 3bec            cmp     ebp,esp
010e50fc e838c2ffff      call    OptimizedInlined!ILT+820(__RTC_CheckEsp) (010e1339)
010e5101 8be5            mov     esp,ebp
010e5103 5d              pop     ebp
010e5104 c3              ret
0:000> .symfix e:\debug\symbols

0:000> lm
start    end        module name
01360000 01367000   OptimizedInlined   (deferred)             
...

0:000> ld OptimizedInlined
Symbols loaded for OptimizedInlined

0:000> x OptimizedInlined!c

0:000> x OptimizedInlined!b

0:000> x OptimizedInlined!a

0:000> x OptimizedInlined!wmain
013612a0          OptimizedInlined!wmain (int, wchar_t **)

0:000> bp OptimizedInlined!wmain

0:000> bl
 0 e 013612a0     0001 (0001)  0:**** OptimizedInlined!wmain

 0:000> g
Breakpoint 0 hit
eax=6142f628 ebx=00000000 ecx=0087a6e8 edx=0019def8 esi=00000001 edi=00000000
eip=013612a0 esp=0042f8f8 ebp=0042f934 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
OptimizedInlined!wmain:
013612a0 8b0d44303601    mov     ecx,dword ptr [OptimizedInlined!_imp_?coutstd (01363044)] ds:002b:01363044={MSVCP120!std::cout (646c6198)}

0:000> u eip L4
OptimizedInlined!wmain [e:\...\optimizedinlined.cpp @ 23]:
013612a0 8b0d44303601    mov     ecx,dword ptr [OptimizedInlined!_imp_?coutstd (01363044)]
013612a6 e895040000      call    OptimizedInlined!std::operator<<<std::char_traits<char> > (01361740)
013612ab 33c0            xor     eax,eax
013612ad c3              ret