Mam problem z moim kodem, który ma kilka bardzo dziwnych objawów.Ten sam kod programu z tym samym kompilatorem prowadzi do różnych plików binarnych
kod jest kompilowany na moim komputerze z następujących wersjach:
się. Wersja GCC: 4.4.2
b. CMAKE verson: 2.8.7
c. QNX (system operacyjny) wersja: 6.5.0
I kod ma segfault jednocześnie zwalniając trochę pamięci i wyjście z funkcji (nie umierają na każdym kodzie, tylko na wyjście z funkcji).
Dziwne rzeczy na ten temat to:
Kod robi to w trybie zwolnienia, ale nie w trybie debug:
się. Kod jest gwintowany, więc oznacza to stan wyścigu.
b. Nie mogę debugować, umieszczając go w trybie debugowania.
Kod, który jest kompilowany na maszynie z tymi samymi wersjami, nie ma tego problemu.
a. Dziwne jest to, że kod działa, ale także, że plik binarny utworzony z kompilacji na swoim komputerze, który jest taki sam, jest o około 6mB większy.
Teraz irytująco nie mogę opublikować kodu, ponieważ jest on zbyt duży, a także do pracy. Ale czy ktoś może wskazać mi drogę do naprawienia tego.
Ponieważ używam QNX jestem ograniczony do moich narzędzi do debugowania, nie mogę używać Valgrind i ponieważ nie jest on obsługiwany w QNX, GDB tak naprawdę nie pomaga.
Szukam każdego, kto miał podobny/ten sam problem i co było przyczyną i jak to naprawili.
EDIT:
Sooo ... dowiedziałem się, co to było, ale im jeszcze trochę mylić o tym, jak to się stało.
Kod winowajcą był następujący:
Eigen::VectorXd msBb = data.modelSearcher->getMinimumBoundingBox();
gdzie definicja getMinimumBoundingBox
to:
Eigen::VectorXd ModelSearcher::getMinimumBoundingBox();
i zwraca VectorXd który jest zawsze zainicjowany jako VectorXd output(6, 1)
. Więc od razu pomyślałem, prawo to musi być ponieważ VectorXd nie jest zainicjowany, ale zmieniając go w ten sposób:
Eigen::VectorXd msBb(6, 1); msBb = data.modelSearcher->getMinimumBoundingBox();
Ale to nie działa.W rzeczywistości miałem to naprawić zmieniając definicję funkcji do tego:
void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);
i wezwanie do tego
Eigen::VectorXd msBb(6, 1); data.modelSearcher->getMinimumBoundingBox(msBb);
Więc teraz nowe pytanie:
Co się piekło? Dlaczego pierwsza zmiana nie zadziałała, ale druga, dlaczego muszę przejść przez referencję? Aha, i wielkie pytanie, jak do cholery to nie pękło, kiedy mój współpracownik go skompilował i uruchomiłem? Jest to prosty błąd pamięci, na pewno nie powinien zależeć od tego, który komputer go skompiluje, zwłaszcza, że kompilator i wszystkie inne ważne rzeczy są takie same !!?
Dzięki za pomoc dla facetów.
Brzmi jak problem z pamięcią - valgrind w trybie debugowania jest nadal wart wypróbowania - to pomoże zdecydować, czy to pamięć, czy nie. – John3136
"1. Kod wykonuje to w trybie zwolnienia, ale nie w trybie debugowania:" - jest to niezbyt częsty objaw problemu z pamięcią (ze względu na różnice w śladzie) –
@ John3136 Niestety nie mogę używać valgrind, ponieważ korzystam z QNX, który ma bez wsparcia. Mogę spróbować zabrać tę funkcję do Linuksa (ubuntu lub Fedora), ale to zajmie całe wieki, więc najpierw chcę wypróbować inne rzeczy. –