2010-04-27 7 views
4

Comment puis-je automatiser le processus de débogage?WinDbg: comment savoir qu'une coupure s'est produite dans WinDbg?

J'ai un script WinDbg avec quelques commandes de base que je veux exécuter lorsqu'une erreur s'est produite dans le processus/application que j'ai attaché à WinDbg. Comment puis-je savoir qu'il y a une pause dans WinDbg, et comment lancer le script automatiquement?

Répondre

2

Vous pouvez utiliser l'option de chaîne de commande lors de la définition du point d'arrêt pour exécuter une commande windbg. Avez-ceci courir votre script.

Quelque chose comme:

bp <address to set break> "$$><c:\\temp\\dbgscript.txt;g" 

Je crois que vous devriez être en mesure de faire la même chose avec la commande sx si vous voulez dire « quand une exception est levée » par « quand il y a une rupture a eu lieu dans le processus ".

1

Exécutez-vous l'application avec windbg déjà attaché, ou êtes-vous débogage JIT? Si ce dernier (c'est-à-dire que vous vous reposez sur le paramètre HKLM \ Softare \ Microsoft \ Windows NT \ AEDebug \ Debugger), modifiez simplement la valeur de la clé Débogueur pour utiliser la commande "-c" pour exécuter une commande après le débogueur attache. En supposant le premier, alors vous pourriez essayer de démarrer le serveur de débogage en utilisant un tube nommé ou tcp (avec la commande .server). Vous pouvez ensuite écrire une application console pour démarrer une instance de cdb en tant que client pour vous connecter au serveur windbg susmentionné et faire analyser l'application stdout jusqu'à ce que vous voyiez l'invite du débogueur. Vous pouvez ensuite automatiser efficacement la session de débogage à partir de ce point. Ainsi, il est réduit un exercice d'analyse, éventuellement enveloppé dans un FSM en fonction de la complexité que vous voulez obtenir.

+0

Merci pour les entrées. Comme vous l'avez deviné, c'est le 1er scénario que je veux mettre en place. – satya

2

exemple Python:

from pykd import * 

def bpCallback(): 

    if is64bitSystem(): 
     objAttr = typedVar("ntdll", "_OBJECT_ATTRIBUTES", reg("r8")) 
    else: 
     objAttr = typedVar("ntdll", "_OBJECT_ATTRIBUTES", ptrPtr(reg("esp") + 0xC)) 

    name = loadUnicodeString(objAttr.ObjectName) 

    dprintln("NtCreateFile: " + name) 

    return DEBUG_STATUS_GO_HANDLED 


if not isWindbgExt(): 
    startProcess("notepad.exe") 


if not isDumpAnalyzing() and not isKernelDebugging(): 

    nt = loadModule("ntdll") 

    b1 = bp(nt.NtCreateFile, bpCallback) 

    # wait for user break, exceptions or process exit 
    go() 

    dprintln("stopped")  

else: 

    dprintln("The debugger must be connected to live usermode process")  

extension Python pour WinDBg abailable ici: pykd.codeplex.com

+0

Je reçois ce "NameError: nom global 'bp' n'est pas défini" .. une idée pourquoi? –