Heisenbug

Ce este un Heisenbug?

In computer programming, un heisenbug este un software bug care dispare sau isi modifica comportamentul in momentul in care cineva incearca sa il studieze.

Scenariu

Problema a fost raportata de anumiti clienti la care in timpul instalarii un crash avea loc, dar nu tot timpul, si doar daca acel installer configura un Service Failure pentru unul din serviciile Win32 instalate.

Pentru a reproduce acest bug trebuie facuti urmatorii pasi: “Install/uninstall the setup on a Windows Server 2012 R2 machine multiple times in a row (this can require sometimes even 16 tries until the crash occurs)”.

Dupa mai multe incercari (10 – 15) am reprodus problema in 2 comportamente diferite:

  1. Ntdll.dll stop working desigur ca efect secundar, nu a fost de mare folos
  2. In celalalt comportament insa se observa o problema la unul din modulele noastre, mai exact la AICustAct.dll

Cum l-am gasit

Mi-am incercat norocul in Event Viewer, si spre surprinderea mea am gasit urmatoarele:

Pe disk-ul Virtual Machine-ului, si am descoperit mini-dumpurile de la crash-ul anterior.

Urmatorul pas?

Am descoperit vinovat-ul, cu toate ca era de asteptate din moment ce suportul pentru “Service Configurations” se afla in acest DLL.

Am mers pe disk-ul Virtual Machine-ului, si am descoperit mini-dumpurile de la crash-ul anterior.

Am continuat in Visual Studio.

  1. Am incarcat simbol-urile pentru modul-ul nostru MSI394.tmp adica AICustAct.dll
  2. Debug with Native Only

Cum l-am reparat

Intr-un final problema pare a fi in CommonCrt::Format() si mai exact urmatoarea linie:

In exemplul concret aceasta locatie de memorie pare a fi cu 54 * sizeof(wchar_t) bytes in-afara buffer-ului alocat, fixul este:

Din moment ce writtenChars, cum se vede in expresia anterioara, este echivalent cu aOutputBuffer – originalStart va rezulta *(originalStart + aOutputBuffer – originalStart) deci => *aOutputBuffer