2015-12-22 16 views
5

Ho trovato la traccia "AKC! _invoke_watson" quando ho usato WinDbg per analizzare il nostro problema. Potresti per favore aiutarmi a spiegare cos'è "_invoke_watson"? E come sapere qual è la causa principale dell'app AKC basata su questa traccia?Che cos'è _invoke_watson in WinDbg?

DEFAULT_BUCKET_ID: NULL_POINTER_READ_IN_CALL 

LAST_CONTROL_TRANSFER: from 00007ff713fe047e to 00007ff713fe03f4 

STACK_TEXT: 
00000000`0274efe0 00007ff7`13fe047e : 00000000`024a36d8 00000000`ce9f27b4 00000000`024a1ac0 00007ff7`13fe3162 : AKC!_invoke_watson+0x18 
00000000`0274f010 00007ff7`13fe0499 : 00000000`00000130 00000000`0274f190 00000000`ffffffff 00000000`0274f120 : AKC!_invalid_parameter+0x6e 
00000000`0274f050 00007ff7`13fe28a6 : 00000000`00000068 00000000`00000000 00000000`00000225 00000000`0000002a : AKC!_invalid_parameter_noinfo+0x19 
00000000`0274f090 00007ff7`13fdab91 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : AKC!_woutput_s_l+0xb42 
00000000`0274f5b0 00007ff7`13fdac52 : 00000000`024a36d8 00000000`00000409 00000000`00000000 00000000`00000000 : AKC!_vswprintf_helper+0x9d 
00000000`0274f620 00007ff7`13fdac9d : 00000000`024a34b0 00000000`00000000 00000000`00000000 00000000`00000000 : AKC!_vswprintf_s_l+0x42 
00000000`0274f660 00007ff7`13fd7885 : 00000000`0000003e 00000000`024a34b0 00000000`00000000 00000000`00000409 : AKC!vswprintf_s+0x11 
00000000`0274f6a0 00007ff7`13fd40a1 : 00000000`024a34b0 00000000`0274f730 00000000`024a3f90 00000000`024a1a70 : AKC!swprintf_s<260>+0x25 
00000000`0274f6d0 00007ff7`13fd48b6 : 00000000`00000026 00000000`024a34b0 00000000`024a34b0 00007ff7`13ff0550 : AKC!Capture::initTag+0xf1 
00000000`0274f980 00007ff7`13fd345e : 00000000`00000000 00000000`024a34b0 00000000`00000026 00000000`000000c8 : AKC!Capture::funcShow+0x56 
00000000`0274f9b0 00007ffc`21e815dd : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : AKC!Capture::Loop+0x50e 
00000000`0274fa50 00007ffc`229d43d1 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd 
00000000`0274fa80 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d 


FOLLOWUP_IP: 
AKC!_invoke_watson+18 [f:\dd\vctools\crt_bld\self_64_amd64\crt\src\invarg.c @ 156] 
00007ff7`13fe03f4 ff159ebe0000 call qword ptr [AKC!_imp_GetCurrentProcess (00007ff7`13fec298)] 

FAULTING_SOURCE_LINE: f:\dd\vctools\crt_bld\self_64_amd64\crt\src\invarg.c 

FAULTING_SOURCE_FILE: f:\dd\vctools\crt_bld\self_64_amd64\crt\src\invarg.c 

FAULTING_SOURCE_LINE_NUMBER: 156 

FAULTING_SOURCE_CODE: 
No source found for 'f:\dd\vctools\crt_bld\self_64_amd64\crt\src\invarg.c' 


SYMBOL_STACK_INDEX: 0 

SYMBOL_NAME: akc!_invoke_watson+18 

risposta

10

_invoke_watson() è una funzione di runtime Microsoft C interna che si è schiantato il vostro programma. È quello che ti ha fatto guardare questo minidump. Non ti dice nulla di interessante, devi guardare la traccia dello stack per vedere come è arrivata. Il problema è iniziata alle:

AKC!swprintf_s<260>+0x25 

Annotare il _s suffisso del nome della funzione, è la secure version di swprintf(). Assicura che sprintf() non possa scrivere oltre la fine del buffer. Lo ha fatto scrivere oltre la fine del buffer, ecco cosa ha provocato l'arresto anomalo. Puoi anche vedere la dimensione del buffer dal nome del modello, 260 caratteri.

Questo è un numero magico in Windows, è il valore di MAX_PATH. Fornisce una buona teoria sul perché il programma si è bloccato, probabilmente è stato chiesto di gestire un nome file che contiene più di 259 caratteri. Non insolito, i programmi C e C++ in generale hanno difficoltà a gestire i file system su Windows che possono creare percorsi con un massimo di 32.767 caratteri. Backgrounder is here.

Oltre all'aggiunta di controlli nel programma per garantire che questo limite non venga superato in modo da fornire una diagnostica migliore, dire al cliente di riorganizzare i dati ed evitare di archiviare file in directory profondamente annidate è la soluzione più semplice.

+0

Grazie per la risposta. Mi piacerebbe molto ringraziare ancora. –