usar - Depuración de contenedores C++ STL en Windbg
map c++ (6)
Los fanáticos de Windbg afirman que es bastante poderoso y yo tiendo a estar de acuerdo. Pero cuando se trata de depurar contenedores STL, siempre estoy atascado. Si la variable está en la pila, la extensión !stl
veces se da cuenta, pero cuando un contenedor con un tipo complejo (por ejemplo, std::vector<TemplateField, std::allocator<TemplateField> >
) está en el montón o parte de alguna otra estructura, simplemente no sé cómo ver sus contenidos.
Apreciar cualquier consejo, punteros.
A menudo encuentro inadecuado el soporte del depurador para los tipos de datos STL. Por este motivo, cada vez uso más los marcos de registro y las declaraciones de registro . Solía pensar que estos son para personas que no pueden usar un depurador, pero ahora me doy cuenta de que ofrecen un valor real. Le permiten incorporar el conocimiento de depuración portátil en su código y mantenerlo junto con el código. Por el contrario, el trabajo que realiza en el depurador suele ser efímero.
Suelo terminar pegando un método toString()
en muchas de mis clases. Esto muestra toda la información que considero importante, cualquier contenedor puede llamar a esto para mostrar la información de la clase en la consola
Utilice dt -r ie dt yourapp! Clase 7ffdf000 -r5
Es posible que también desee probar esta extensión de depurador . Es una biblioteca llamada SDbgExt, desarrollada por Skywing .
Tuve exactamente la misma pregunta hace algún tiempo. Mi respuesta es que Visual Studio es realmente un mejor depurador para STL y tipos complejos (al igual que Visual Studio es simplemente un mejor depurador que MDbg).
Esto no quiere decir que WinDBG sea menos poderoso, solo que es un nivel más bajo (por ejemplo, intente hacer cualquier cosa útil con volcados de emergencia usando Visual Studio; no puede).
De todos modos, para responder a su pregunta, puede usar Visual Studio para ver los tipos de datos usando algunos trucos:
- Inicie otra instancia de WinDBG, adjunte de forma no invasiva:
cdb -p <PID> -pv
. Esto suspenderá los hilos del debugee. Ahora puede separar con seguridad el WinDBGqd
original - Adjunte Visual Studio a él, y luego separe la no invasiva WinDBG
qd
. Mire la STL y continúe como desee. - Cuando necesite volver a WinDBG, vaya al paso 1, cambie con un invasivo WinDBG.
La extensión de Python para WinDbg (pykd) tiene el fragmento stlp.py que puede volcar el contenido del mapa.
Actualmente es compatible con la implementación del mapa STLPort. Probado en x86 y x64. Este artículo muestra cómo usarlo (está en ruso, pero los ejemplos se explican por sí mismos).