Crash po przeniesieniu gry na Debiana 9

0

witam, po przeniesieniu gry na Debian 9 mam nietypową rzecz, i po odpaleniu gry crashuje ją. to nie występuję na debian 7/8

gdb log:

Switching to Thread 0x7ffff327b700 (LWP 1417)]
0x0000555555658547 in NpcScript::luaSelfGetPos(lua_State*) ()

c++

int32_t NpcScript::luaSelfGetPos(lua_State *L){
    lua_pop(L,1);
    Npc* mynpc = getNpc(L);
    lua_pushnumber(L, mynpc->pos.x);
    lua_pushnumber(L, mynpc->pos.y);
    lua_pushnumber(L, mynpc->pos.z);
    return 3;
}

orientuję się ktoś może dlaczego tak się dzieje? bo ja nie mam pojęcia.

0

wpisz do gdb bt copy paste i wklej kod powiązany.
Jak używasz IDE znajdż okno "Call Stack" przeklikaj wszystkie pozycje i analizuj wskazany kod.

Albo skorzystaj z Adress Sanitizera (clang lub gccc, trzeba przebudować aplikację z odpowiednimi flagami) i spróbuj ten sam scenariusz odtworzyć na swojej maszynce.

Podany przez ciebie kontekst problemu nie pozwala na nic lepszego.

0

znalazłem błąd:

iomapotbm.cpp:411:32: error: cannot convert ‘bool’ to ‘Item*’ in return
                         return false;

po tym jak zmieniłem return false; na return; zaczeło crashować, ten błąd nie występuję na debian 7/8 tylko na 9 nie wiem dlaczego wywala ten błąd przy kompilacji wie ktoś jak mogę to poprawić?

bez return false; aplikacje mi crashuje.

tutaj ten kawałek kodu

Container* container;
if(container = dynamic_cast<Container*>(item)){
uint32_t type;
NODE item_node = f->getChildNode(node, type);
while(item_node){
if(type == OTBM_ITEM){
Item* item = unserializaItemNode(f, item_node);
if(item){
container->addItem(item);
}
else{
return false;
}
}
item_node = f->getNextNode(item_node, type);
}
0

To jak, funkcja zwraca wskaźnik Item*, a Ty wciskasz tam false?

0

poradziłem sobię, wystarczyło zmienić g++-6 na g++4.9

2
Programistyczny napisał(a):

poradziłem sobię, wystarczyło zmienić g++-6 na g++4.9

Jak ty tak naprawiasz błędy to współczuje twojemu pracodawcy (przyszłemu lub obecnemu).
Nadal masz błąd w kodzie, ale zmiana kompilatora spowodowała, że błąd na twoim komputerze nie przynosi tragicznego skutku od razu.
Wystarczy, że u użytkownika, będzie inna biblioteka, inne CPU, inna wielkość strony, inna dystrybucja, albo inna faza księżyca, a będzie odtwarzał tego crasha w 100% przypadków.
Ty tylko zamiotłeś problem pod dywan.

Do wykrywania takich rzeczy są narzędzia, już ci pisałem, żebyś spróbował AdressSanitizer-a (opcja kompilatora, która buduje kod z dodatkowymi mechanizmami sprawdzającymi poprawność kodu). To jest naprawdę super narzędzie, generujące bardzo dokładne raporty co jest źle.
Narzędzie to łapie te błędy, bez względu czy doprowadzą do crash-a, czy nie.

Jeśli możesz używać Clang to on ma jeszcze inne Sanitizer-y, które też warto spróbować.

Inna alternatywa to valgrind, który wymaga tylko wersji debug, jest wolniejszy i mniej precyzyjny, ale też pozwala na wykrywanie takich błędów.

Ja zwykle używam Mac OS i Xcode jest dobrze zintegrowany z clang, więc użycie tych narzędzi tam jest banalnie proste (nie wiem jak to wygląda na Linux).

1 użytkowników online, w tym zalogowanych: 0, gości: 1