to jest moje pierwsze pytanie tutaj na stackoverflow, więc postaram się być konkretny. Przeszukałem fora pod kątem pokrewnego tematu, ale bez powodzenia. W każdym razie tutaj:Wyjątek przepełnienia stosu przed głównym()
Używam Visual Studio 2005. Napotkałem wyjątek przepełnienia stosu: Nieobsługiwany wyjątek 0x775715de w IHR.exe: 0xC00000FD: Przepełnienie stosu. , podczas próby debugowania mojego projektu. Stos wywołań nie pomaga, ponieważ zatrzymuje się w pliku ntdll.dll, zanim nawet wejdzie w funkcję main().
Początkowo podejrzewałem, że może to być ustawienie kompilacji, ale kiedy wysłałem plik wykonywalny skompilowany na moim komputerze do drugiego komputera, mógł on działać poprawnie, po prostu nie będzie działał na moim komputerze.
To samo dzieje się w odwrotnej kolejności, skompilowałem plik wykonywalny na drugim komputerze, może to działać dobrze. Ale kiedy próbowałem uruchomić plik wykonywalny, który został skompilowany na drugim komputerze na moim komputerze, nie mógł działać. Wszystko, co się pojawiło, to puste okno wiersza poleceń i komunikat Windows, że program nie odpowiada.
Używam Windows 7 Professional SP1, 64-bitowy. Drugi komputer ma tę samą wersję systemu operacyjnego. Ze względu na politykę firmy nie mogę tutaj umieścić żadnego kodu źródłowego, ale w każdym razie nie sądzę, że ma to coś wspólnego z kodem źródłowym. Podejrzewam, że może to być problem w środowisku wykonawczym. Doceniam każdą pomoc. Dzięki.
Tutaj wszystko jest na stos wywołań:
->ntdll.dll!775715de()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!775715de()
ntdll.dll!7756014e()
Dzięki użytkownika @ WhozCraig sugestia, udało mi się uzyskać bardziej znaczący komunikat na stosie wywołań. Ciągle się jednak zastanawiałem.
_mbscmp IHR.exe! (Const unsigned char * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10) Linia 84 + 0xf bajtów
_mbscmp IHR.exe! (Const unsigned char * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10) Linia 84 + 0xf bajtów
IHR.exe! strcmp (const char * _s1 = 0x00fe8c10, const char * _s2 = 0x00fe8c10) Linia 1646 + 0x2b bajtów
IHR.exe! _mbscmp_l (const unsigned char * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10, localeinfo_struct * plocinfo = 0x00000000) Linia 58 + 0xd bajtów
IHR.exe! _mbscmp (const unsigned char * s1 = 0x00fe8c10, const unsigned char * s2 = 0x00fe8c10) Linia 84 + 0xf bajty
strcmp IHR.exe! (const char * _s1 = 0x00fe8c10, const char * _s2 = 0x00fe8c10) Linia 1646 + 0x2b bajtów
oto niektóre bardziej, prowadząc do stosu powyżej
IHR.exe!_mbscmp_l(const unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10, localeinfo_struct * plocinfo=0x00000000) Line 58 + 0xd bytes C++
IHR.exe!_mbscmp(const unsigned char * s1=0x00fe8c10, const unsigned char * s2=0x00fe8c10) Line 84 + 0xf bytes C++
IHR.exe!strcmp(const char * _s1=0x00fe8c10, const char * _s2=0x00fe8c10) Line 1646 + 0x2b bytes
IHR.exe!_setlocale_get_all(threadlocaleinfostruct * ploci=0x002f13a0) Line 1147 + 0x24 bytes
IHR.exe!_setlocale_nolock(threadlocaleinfostruct * ploci=0x002f13a0, int _category=0, const char * _locale=0x00000000) Line 966 + 0x9 bytes C
setlocale IHR.exe! (int _category = 0, const char * _locale = 0x00000000) Linia 826 + 0x1b bajtów
std IHR.exe! :: _ Locinfo :: _ Locinfo_ctor (std :: _ Locinfo * pLocinfo = 0x0018f8f8, const char * locname = 0x00ea591c) Linia 192 + 0x9 bajtów
IHR.exe! Std :: _ Locinfo :: _ Locinfo (const char * _Pch = 0x00ea591c) Wiersz 78 + 0xd bajtów
IHR.exe! Std :: ctype :: ctype (const short * _Table = 0x00000000, bool _Deletetable = false , unsigned int _Refs = 0) Linia 1740 + 0x10 bajtów
IHR.exe! std :: ctype :: _ Getcat (const std :: locale :: facet * * _Ppf = 0x0018fbd8) Linia 1760 + 0x4d bajtów IHR.exe! std :: use_facet> (const std :: locale & _Loc = {...}) Linia 478 + 0x9 bajtów IHR.exe!std :: basic_ios> :: poszerz (char _Byte = '') Wiersz 124 + 0x34 bajtów
IHR.exe! std :: basic_ios> :: init (std :: basic_streambuf> * _Strbuf = 0x00ff7908, bool _Isstd = false) Linia 135 + 0xa bajty
IHR.exe! Std :: basic_ostream> :: basic_ostream> (std :: basic_streambuf> * _Strbuf = 0x00ff7908, bool _Isstd = false) Linia 53
IHR.exe! Std :: `inicjator dynamiczny dla 'cout' '() Linia 13 + 0x16 bajtów IHR.exe! _initterm (void (void) * * pfbegin = 0x00e8d10c, void (void) * * pfend = 0x00e9dca0) Linia 855 IHR.exe! _cinit (int initFloatingPrecision = 1) Linia 293 + 0xf bajtów
IHR.exe! tmainCRTStartup() Linia 310 + 0x7 bajty
IHR.exe! MainCRTStartup() Linia 196
kernel32.dll! @ BaseThreadInitThunk @ 12() + 0x12 bajtów
Ntdll.dll!RtlUserThreadStart @ 8() + 0x27 bajtów
ntdll.dll! _RtlUserThreadStart @ 8() + 0x1b bajtów
Utrzymuje wielokrotnie nazywając strcmp, mbscmp, mbscmp_l dopóki nie natrafi wyjątek przepełnienia stosu.
Aktualizacja (11 kwietnia 2013 r.): Znalazłem linię, która powoduje problem, ale wciąż nie mam pojęcia, dlaczego to powoduje. Jest to użycie strcmp.
struct Foo
{
char text[4];
bool operator < (const Foo &rhs) const
{
return strcmp(text, rhs.text) < 0;
}
}
Po skomentowaniu tego polecenia strcmp. Program się nie zawiesza. Jakieś pomysły lub doświadczenie w radzeniu sobie z takim problemem? Ten sam program nadal działa dobrze na innych komputerach, ale tylko zawiesza się na moim komputerze z powodu tej linii. inny program strcmp jest używany w całym programie bez problemu. Dzięki
Czy prosty program "cześć świat" wykazuje takie samo zachowanie? Nie, to jest coś w twoim kodzie, przynajmniej do pewnego stopnia. –
nie, Hello World nie powoduje tego problemu. Jeśli ma to coś wspólnego z moim kodem, dlaczego może działać na innym komputerze z tym samym systemem operacyjnym? – mikevil14rin
po ślad stosu, to może pomóc –