Domanda

Informazioni di base

Per salvare i crash dump, ho uno script passato a cdb.exe nel Debugger valore della AeDebug chiave di registro:

C:\progra~1\debugg~1\cdb.exe -p %ld -e %ld -g -y SRV*c:\mss*http://msdl.microsoft.com/download/symbols -c "$<d:\tgticker\Dumps\RDFD.cdbscript"

Ecco la prima parte dello script:

as /c CrashFirstModule .printf "%mu", @@c++((*(ntdll!_LDR_DATA_TABLE_ENTRY**)&@$peb->Ldr->InLoadOrderModuleList.Flink)->BaseDllName.Buffer) 

.logopen /t d:\tgticker\dumps\${CrashFirstModule}_process.log

* (...)

Il problema

Con i simboli, funziona esattamente come vorrei, ottengo file di registro con nomi sensibili come:

  • LHCBDRDT.exe_process_147c_2009-01-06_23-10-05-371.log

Tuttavia, se i simboli non sono disponibili, ottengo un nome di file di registro come questo:

  • ${CrashFirstModule}_process_17a8_2009-01-06_23-10-01-124.log

Questo perché il comando alias non è riuscito a impostare l'alias. Il comando alias è quello che ho raccolto da DumpAnalysis.org . Questo comando estrae il nome dall'intestazione PEB per l'immagine, usando ntdll.dll. Senza simboli per il sistema operativo, non sa dove trovare la funzione che sta chiamando da ntdll.dll.

La domanda

Qualcuno sa o ha un comando per ottenere il nome dell'immagine come alias da usare in nomi di file che funzionerebbero comunque in queste situazioni?

È stato utile?

Soluzione

Quindi eccomi qui anni dopo con una risposta.

La risposta

In assenza di file di simboli, questo è il modo migliore che ho trovato per ottenere il nome dell'eseguibile che è andato in crash in modo che possa essere utilizzato in un nome file per scrivere un file di registro o un dump di arresto anomalo da uno script:

aS ${/v:CrashFirstModule} "UnknownModule"
.foreach /pS b /ps b (name {.imgscan}) { .if($spat("${name}","*.exe") !=0){aS ${/v:CrashFirstModule} "${name}"; .break} }

Dopo queste due righe, CrashFirstModule sarà impostato su " UnknownModule " o il nome dell'eseguibile. Funziona solo se l'eseguibile termina in & Quot; .exe & Quot ;, ma questo mi sembra ragionevole, e funziona bene nel caso in cui lo sto usando. Puoi aggiungere un altro .if per gestire altri finali se hai bisogno di supportare cose come & Quot; .com & Quot ;.

La risposta: spiegata

.imgscan

.imgscan fornisce un elenco di moduli eseguibili, che includeranno .exe, .dll, .drv ecc. Questo è il punto di partenza per trovare il nome dell'eseguibile.

0:000> .imgscan
MZ at 01000000, prot 00000002, type 01000000 - size 14000
  Name: notepad.exe
MZ at 73070000, prot 00000002, type 01000000 - size 27000
  Name: WINSPOOL.DRV
MZ at 762b0000, prot 00000002, type 01000000 - size 49000
  Name: comdlg32.dll
MZ at 76f50000, prot 00000002, type 01000000 - size 13000
  Name: Secur32.dll
MZ at 77380000, prot 00000002, type 01000000 - size 91000
  Name: USER32.dll
MZ at 77420000, prot 00000002, type 01000000 - size 103000
  Name: COMCTL32.dll
MZ at 77ba0000, prot 00000002, type 01000000 - size 5a000
  Name: msvcrt.dll
MZ at 77c00000, prot 00000002, type 01000000 - size 48000
  Name: GDI32.dll
MZ at 77c50000, prot 00000002, type 01000000 - size a0000
  Name: RPCRT4.dll
MZ at 77e40000, prot 00000002, type 01000000 - size 102000
  Name: KERNEL32.dll
MZ at 7c800000, prot 00000002, type 01000000 - size c3000
  Name: ntdll.dll
MZ at 7c8d0000, prot 00000002, type 01000000 - size 7ff000
  Name: SHELL32.dll
MZ at 7d180000, prot 00000002, type 01000000 - size 52000
  Name: SHLWAPI.dll
MZ at 7d1e0000, prot 00000002, type 01000000 - size 9c000
  Name: ADVAPI32.dll

.foreach

.foreach viene utilizzato per percorrere l'elenco delle immagini. /pS specifica fino a che punto è il primo valore nell'elenco. /ps specifica la distanza tra i valori. (b = 11 in esadecimale) Ciò è necessario poiché $spat si separerà negli spazi. Con questi argomenti, l'elenco diventa:

0:000> .foreach /pS b /ps b (name {.imgscan}) { .echo name }
notepad.exe
WINSPOOL.DRV
comdlg32.dll
Secur32.dll
USER32.dll
COMCTL32.dll
msvcrt.dll
GDI32.dll
RPCRT4.dll
KERNEL32.dll
ntdll.dll
SHELL32.dll
SHLWAPI.dll
ADVAPI32.dll

$ battibecco

${} è la funzione di corrispondenza della stringa con caratteri jolly MASM. Abbinerà il primo argomento al modello nel secondo argomento. Non fa distinzione tra maiuscole e minuscole, quindi corrisponderà a NOTEPAD.EXE nonché a NotePad.eXe, ecc.

.if($spat("${name}","*.exe") !=0) {.echo "found it!"}

$ {}

${<alias name>} è l'interprete alias. Hai incorporato .echo CrashFirstmodule dove vuoi che il valore del tuo alias sia scritto in una stringa. se stai usando l'alias in un comando, puoi semplicemente usarlo, quindi notepad.exe echeggerebbe ${/v:<alias name>}. Nei casi in cui si intende effettivamente il nome dell'alias, è possibile specificarlo come aS CrashFirstModule "${name}" che si risolverà semplicemente con il nome dell'alias. Questa prevenzione dell'espansione è necessaria quando si riassegna un alias. UnknownModule avrebbe comportato l'impostazione dell'alias aS su .break, poiché <=> sarebbe stato espanso al suo valore prima dell'esecuzione del comando.

come

<=> è uno dei comandi per assegnare gli alias. <=> è terminato da; o la fine della riga e rimuoverà la quot &; dalla voce. La seguente riga sarà alias da <=> a <=>:

aS ${/v:CrashFirstModule} "UnknownModule"

.BREAK

<=> termina il <=> dopo aver trovato una corrispondenza.

Fine

Sono tutti i pezzi che compongono il comando che sto usando. Spero che qualcun altro tragga qualche beneficio da questa domanda e risposta!

Altri suggerimenti

perché non usare le informazioni peb? Di seguito è quello che ti serve:

?? @$peb->ProcessParameters

ntdll.dll sarà presente in ogni processo, quindi immagino che il problema sia il caricamento dei simboli.

Comunque, questo dovrebbe funzionare per sbarazzarsi dell'interruzione di linea:

.foreach(Module {lm 1m}) { aS CrashApp Module; .break }

.foreach(Module {lm 1m a $exentry}) { aS CrashApp Module }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top