2010-07-23 27 views
8

tengo que desarrollar una ruta de rastreo de pila a nuestro soporte de plataforma win32 API para detectar cualquier excepción con un comportamiento de stack stack de JAVA. En realidad, obtuvimos una implementación funcional completa para las plataformas de Linux.Win32 pila API caminar con MinGW/MSYS?

Primero intenté implementar un apilamiento utilizando el mecanismo win32 CaptureStackBackTrace API . Pero este método no está integrado en la cabecera realidad winbase de MinGW (usando MSYS/MinGW 5.1.x) ...

así que decidí trataron uso del mecanismo dbgheader follwoing las instrucciones de este enlace: http://sites.google.com/site/kenscode/prime-programs/boinc-with-mingw-on-win32

Pero vuelvo a fallar y me encuentro con errores de enlazador que no pude resolver. Creo que MinGW no pudo resolver la biblioteca de dbgheader ....

DrMinGW no es una opción para mí, si bien es un depurador JIT, tengo que implementar una pila de rastreo mechansim, para cualquier excepción que ocurra en tiempo de ejecución con un rastreabilidad de archivos de registro personalizables como sabemos por JAVA ...

¿Alguien ha conseguido MSYS/MinGW runable con la API de win32 en apretón de manos? No cambiaré el compilador al feo compilador MVC en lugar de usar MSYS/MinGW ...

Gracias por cualquier pista. Saludos,

cristianos

+0

Un seguimiento de la pila es solo su segunda mejor opción. Si desea obtener diagnósticos verdaderamente útiles, [escriba un minivolcado] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx) en su lugar. – IInspectable

Respuesta

7

Comprobar el Sr. Edd en el siguiente enlace. Producirá una buena lista de cuadros de pila y tiene un código específico para admitir MinGW.

http://www.mr-edd.co.uk/code/stack_trace

Su biblioteca utiliza dbghelp.dll, sin embargo, por lo que puede entrar en algunos problemas al tratar de compilarlo. Por lo que sé, MinGW no incluye una biblioteca de importación para este archivo DLL (consulte una solicitud de función anterior here). Sin embargo, tuve éxito al crear una sola biblioteca de importación. Puede hacer lo mismo usando sólo un archivo .def del proyecto Wine (comprobar los archivos adjuntos del enlace anterior para uno) y ejecutar la utilidad de dlltool MingW:

dlltool -k -d dbghelp.def -l dbghelp.a 

A continuación, puede incluir el archivo resultante en dbghelp.a tu proyecto. Probablemente no le gustará tener dependencias hacia dbghelp.dll en sus compilaciones de lanzamiento, ya que la DLL en sí misma seguramente no es redistribuible.

+1

El Sr. Edd tiene una biblioteca más nueva, dbg, http://www.mr-edd.co.uk/code/dbg. – yrnkrn

1

tengo seguimientos de pila que trabajan en MingGW con Edd's dbg biblioteca, que es un sucesor a su mínima stack_trace biblioteca:

Con msys2, esto debe conseguir que un seguimiento de pila:

$ pacman -S mingw-w64-x86_64-edd-dbg 
// main.cpp 
#include <dbg/frames.hpp> 
#include <dbg/symbols.hpp> 
#include <iostream> 

int main() 
{ 
    dbg::symdb db; 
    dbg::call_stack<64> traceback; 
    traceback.collect(0); 
    traceback.log(db, std::cout); 
    return 0; 
} 
$ g++ -ggdb main.cpp -ldbg 
$ ./a.exe 
0x0000000000402ee9: dbg::call_stack<64u>::collect(unsigned int) in C:\msys64\home\phil\stacktrace-example\a.exe 
0x00000000004015f2: main in C:\msys64\home\phil\stacktrace-example\a.exe 
0x00000000004013f8: __tmainCRTStartup in C:\msys64\home\phil\stacktrace-example\a.exe 
0x000000000040151b: mainCRTStartup in C:\msys64\home\phil\stacktrace-example\a.exe 
0x00007ffbb0838102: BaseThreadInitThunk in C:\WINDOWS\system32\KERNEL32.DLL 
0x00007ffbb27cc5b4: RtlUserThreadStart in C:\WINDOWS\SYSTEM32\ntdll.dll 

Más sobre dbg se puede encontrar en Wiki.El código está disponible aquí: https://bitbucket.org/edd/dbg/src