Pergunta

Eu quero acessar a pilha de chamadas em tempo de execução no aplicativo um nativo C ++. Eu não estou usando o IDE. Como faço para exibir a pilha de chamadas?

Update: Eu tenho uma função que é chamado de muitos pontos em todo o aplicativo. Ele trava em raras ocasiões. Eu estava procurando uma maneira de obter o nome do chamador e registrá-lo.

Foi útil?

Solução

Eu acredito que desta página tem a resposta que você está procurando. Você disse que Visual C então eu suponho que você janelas médios.

Outras dicas

Tenha um olhar em StackWalk64 .

Se você está acostumado a fazer isso em .NET, então você está em uma surpresa desagradável.

Você deve considerar definir o seu não manipulado filtro exceção e escrever um MiniDump arquivo de dentro dele. Não é tão complicado e é bem documentado . Ater apenas ao mínimo de coisas que você faz uma vez em seu filtro de exceção não tratada (leia o que puder tudo deu errado se você ser criativo).

Mas, para ser no lado seguro (seu filtro de exceção não tratada pode ter inadvertidamente substituído), você pode colocar o seu código dentro __try / __ exceto bloco e escrever o minidump de dentro da função filtro (nota, você não pode ter objetos que exigem automática desenrolando em uma função com __try / __ exceto bloco, se você não tê-los, considere colocá-los em uma função separada):

longa __stdcall MyFilter (EXCEPTION_POINTERS * pexcept_info)
{
mycreateminidump (pexcept_info);
retorno EXCEPTION_EXECUTE_HANDLER;
}
vazio myfunc ()
{
__try {
// sua lógica aqui
} __Except (myfilter (GetExceptionInformation ())) {
// exceção tratada
}
}

Você pode então inspecionar o arquivo de despejo com um depurador de sua escolha. Ambos Visual Studio e depuradores de pacote de ferramentas do Windows de depuração pode lidar com minidumps.

Se você deseja obter um callstack do acidente, o que você realmente quer fazer é post mortem depuração . Se você quiser verificar a pilha de chamadas de aplicativo enquanto ele estiver em execução, esta é uma das muitas funções SysInternals Process Explorer oferta lata.

Se você não está depurando ativamente, você pode "crash" do aplicativo para produzir um minidespejo (isso pode ser feito de forma não invasiva e permite que o aplicativo continue em execução). IIRC DrWatson vai deixar você fazer isso, se não userdump de suporte MS vai.

Você pode então carregar o despejo em windbg e veja as variáveis ??callstack + etc lá. Você vai precisar de símbolos de seu aplicativo para fazer sentido do traço.

Se você está procurando um simples traços de estilo de código em tempo de execução, eu recomendo um simples classe que você instancia em cada método, o construtor escreve o nome do método usando OutputDebugString. Use WinDebug para ver o traço como o programa é executado. (Colocar alguma forma de controle em sua classe, mesmo que seja apenas uma variável global ou valor de registo, ou Atom global, de modo que você pode transformar o traçado ligado ou desligado à vontade).

Ele trava em raras ocasiões. Eu estava procurando uma maneira de obter o nome do chamador e registrá-lo.

O que você quer dizer com ele trava? Violação de acesso? Divida por zero? o que exatamente? Será que interagem com componentes do modo kernel?

Ligue AppVerifier. que deve eliminar um monte de coisas.

criar esta:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Execution Image File Options \ FileName.exe

sob essa chave, criar uma nova seqüência Nome: depurador valor: c: \ pathtowindbg \ windbg.exe GG -XE av

Se você estiver executando o código de 32 bits com WOW, você precisa fazer isso sob a wow3264node.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top