Próbuję usunąć błąd, w którym plik wykonywalny generuje powtarzalne wyniki (które chcę), gdy jest wykonywany bezpośrednio z programu Visual Studio, ale robi , a nie generuje powtarzalne wyjście po uruchomieniu z wiersza polecenia. Jest to aplikacja jednowątkowa, więc nie powinno być żadnych dziwnych zachowań w zakresie czasu.Różnice między uruchamianiem pliku wykonywalnego z debugerem Visual Studio a bez debugowania
Czy ktoś może wyliczyć możliwe różnice między tymi dwoma środowiskami?
Jestem pewien, że rzeczywisty plik wykonywalny jest taki sam - oba są wersjami kompilacji i działają z tym samym plikiem .exe.
Oto środowisk i rezultaty:
- uruchomić bezpośrednio z wiersza poleceń (cmd): wyjście jednorazowych
- Run z Visual Studio debugowania (F5): wyjście Powtarzalne
- Run z Visual Studio bez debugowania (Ctrl-F5): Nieodwracalne wyjście
Wiem, że katalog roboczy może być inny, ale ręcznie dostosowuję to, aby upewnić się, że w katalogu roboczym jest identyczny.
Na podstawie tych wyników wygląda na to, że uruchomienie "z debugowaniem" (nawet w wersji Release) w jakiś sposób rozwiązuje problem. Czy to wskazuje na prawdopodobnego sprawcę? Jakie są różnice między uruchamianiem pliku wykonywalnego z debugowaniem i bez?
ROZWIĄZANIE: Jak wskazano w zaakceptowanej odpowiedzi, problemem była stertka debugowania. Problem polegał na tym, że w głębi naszego kodu ktoś miał dostęp do części dużego układu, zanim zostały zainicjalizowane. Podzieliły pamięć z malloc i nie zainicjowały pamięci do 0. Stuła debugowania (przypuszczam) wypełniłaby tablicę pewną wartością powtarzalną, podczas gdy debugger nie był podłączony (tj. Gdy uruchomiono z linii poleceń lub z Ctrl-F5) wartości były bardziej losowe i czasami powodowały niewielkie odchylenia w zachowaniu programu. Niestety, regulacja była tak subtelna, że prawie nieodczuwalna, a wspomniane pytanie zostało poprawnie zresetowane po pierwszej "ramce" przetwarzania, ale warunki początkowe były już nieco inne i uszkodzenia zostały już wykonane. Teoria chaosu w akcji! Dzięki za wskazówki.
Jedna świetna wskazówka dotycząca debugowania, która pomogła: napisać niestandardowy malloc, który natychmiast zapełnia pamięć całkowicie losowymi danymi. W ten sposób możesz upewnić się, że poprawnie go zainicjujesz przed użyciem, w przeciwnym razie twoje wyniki będą (miejmy nadzieję) szalone przy każdym uruchomieniu - nawet w trybie debugowania z stertą debugowania!
Zależy od kodu. Być może wyzwalasz niezdefiniowane zachowanie, które pojawia się tylko na wyższych poziomach optymalizacji. –
Ale teoretycznie nie jest jedyną różnicą, że debugger nie jest dołączony? Kompilacja jest identyczna - Release build za każdym razem. Stopień optymalizacji się nie zmienia. – aardvarkk
Wiem, że mówisz, że dostosowujesz się do katalogu roboczego, ale wydaje się, że to prawdopodobny sprawca. Innym problemem, na który powinienem poszukać, są zainstalowane biblioteki. VS obsługuje zależności (a jeśli tworzysz i instalujesz poprzez ClickOnce, który obsługuje twoje zależności), ale uruchomienie bezpośrednio z wiersza poleceń może nie. –