Gdy 64-bitowa aplikacja VC 2005 zostanie skompilowana z włączoną optymalizacją, nie będzie można zobaczyć wszystkich zmiennych lokalnych w pliku zrzutu awaryjnego. W wielu przypadkach lokalne zmienne lub parametry są przechowywane w rejestrach zamiast na stosie. Kolejne wywołania innych funkcji, takich jak funkcje obsługi błędów, czasami nadpisują te wartości. Utrudnia to śledzenie przyczyny problemu. Czy istnieje sposób na wymuszenie zmiennych lokalnych i/lub parametrów na stosie w czasie wykonywania?Dowolny sposób wymuszania zmiennych lokalnych na stos w 64-bitowej aplikacji VC
Wyłączenie optymalizacji jest jednym ze sposobów, ale to sprawia, że aplikacja jest wolna i generalnie nie jest dobrym pomysłem na kompilację wydania. Mam nadzieję, że istnieje wywołanie czasu wykonywania, który będzie zrzucić wszystkie lokalne zmienne i/lub rejestru gdzieś. Jeśli istnieje taka funkcja, możemy wywołać tę funkcję przed wywołaniem funkcji rejestrowania błędów i mamy nadzieję, że będziemy mogli zobaczyć więcej lokalnych zmiennych na stosie.
- Alex
Wczoraj prawie rozwiązałem ten problem. Kłopot polega na tym, że w linii assembler nie jest obsługiwany w msvc na 64-bitowej platformie. Ideą jest użycie w linii montażowej do zapisania rejestrów do pewnej zmiennej globalnej przed wywołaniem procedury obsługi błędów, która generuje zrzut awaryjny.Na przykład: jeśli (x> y) { __asm { mov guqRegRBX, RBX // i inne rejestry } logError (__FILE__, __LINE__, ...) } Oczywiście, cały blok idzie być makrem, więc można go bardzo łatwo wykorzystać w kodzie. W ten sposób jestem pewien, że x i y można odzyskać. –
Przykro mi, to wygląda brzydko. Nie wiem, jak sformatować komentarz. –