2012-10-31 7 views
8

Używam gdb do debugowania programu C++. W liniidebugowanie C++: ../nptl/sysdeps/unix/sysv/linux/raise.c: Brak takiego pliku lub katalogu

assert(prevId == GetTagIdFromState(maxState)); 
  • parametr prevId wartość 0;
  • metoda GetTagIdFromState(maxState)return s 50;

podczas debugowania tego, otrzymuję następujące błędy.

Assertion `prevId == GetTagIdFromState(maxState)' failed. 
Program received signal SIGABRT, Aborted. 
0x00007ffff6ecbba5 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 
64 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
     in ../nptl/sysdeps/unix/sysv/linux/raise.c 
+0

Jeśli ktokolwiek się o to potknął, miałem ten sam błąd. Dla mnie wyjaśniono, że był zamek zamknięty, ale nigdy nie zwolniony. Nie jestem pewien, dlaczego to nie tylko impas. Nie wiem, czy to pomoże, ale doszłam do wniosku, że przekazałbym ci moje. – Homer6

Odpowiedz

7

Twoja aplikacja działa zgodnie z przeznaczeniem. Asercja kończy się niepowodzeniem (ponieważ wartości, które mu przekazujesz, nie są równe, makro assert otrzymuje 0), a zatem twój program jest przerywany. To, jak twierdzi pracy:

Jeśli NDEBUG nie jest zdefiniowana, to dochodzenia sprawdza, czy jej argument (co musi mieć skalarne typ) porównuje równa zeru. W takim przypadku należy podać wyjściowe informacje diagnostyczne dotyczące implementacji standardowego wyjścia o błędzie i wywołania std :: abort.

podkreślenie moje.

Aby uzyskać więcej informacji, sprawdź numer this assert reference.

+5

Najpierw dziękuję. Jestem nowy w C++. Wiedziałem, że twierdzenie nie powiedzie się, ale czy możesz mi doradzić, dlaczego błąd "../nptl/sysdeps/unix/sysv/linux/raise.c: Brak takiego pliku lub katalogu." araises. Wygląda na to, że program nie może znaleźć pliku. – wangzhiju

+4

Nie ma się czym martwić. Makro assert wywołuje (prawdopodobnie pośrednio) funkcję o nazwie raise. Dzieje się to w bibliotece, do której łączysz się z kodem. Po skompilowaniu tej biblioteki (na innym komputerze) był plik o nazwie "../nptl/sysdeps/unix/sysv/linux/raise.c", ale teraz, gdy jest uruchomiony na twoim komputerze, ten plik już nie istnieje. Jeśli chcesz, aby ten błąd zniknął, prawdopodobnie musisz pobrać kod źródłowy tej biblioteki. – john

+0

@wangzhiju, cóż, sądząc po ścieżce, wygląda na to, że lib, którego używasz, został skompilowany na jego maszynie programisty przy użyciu pliku '../ nptl/sysdeps/unix/sysv/linux/raise.c'. Ponieważ na twoim komputerze nie ma takiego pliku, masz błąd. Nie powinno to jednak prowadzić do żadnych problemów, więc równie dobrze możesz go zignorować. – SingerOfTheFall

0

Powinno to doprowadzić cię do prędkości o użyciu funkcji dochodzić

void assert (int expression); 

ocenić twierdzenie Jeśli wyrażenie argument tego makra z postaci funkcjonalnej porównuje równa zeru (tj wyrażenie jest fałszywe), komunikat jest zapisywane do standardowego urządzenia błędu i wywoływane jest przerwanie, kończące wykonywanie programu.

Szczegóły wyświetlanego komunikatu zależą od konkretnej implementacji w kompilatorze, ale muszą zawierać: wyrażenie, którego stwierdzenie nie powiodło się, nazwę pliku źródłowego i numer wiersza, w którym nastąpiło. Typowym formatem wyrażeń jest:

Asercja nie powiodła się: wyrażenie, nazwa pliku pliku, numer wiersza linii To makro jest wyłączone, jeśli w momencie włączenia assert.h zostało już zdefiniowane makro o nazwie NDEBUG. Pozwala to na koder włączenia wiele połączeń dochodzić w kodzie źródłowym podczas debugowania programu, a następnie wyłączyć wszystkie z nich w wersji produkcyjnej, po prostu w tym taką linię:

#define NDEBUG at the beginning of its code, before the inclusion of assert.h. 

Dlatego to makro jest przeznaczony do przechwytywania błędy programistyczne, a nie błędy użytkownika lub uruchomione, ponieważ są generalnie wyłączone po tym, jak program zakończy fazę debugowania. od: C++ Ref

0

Po prostu napotkałem ten błąd podczas próby debugowania programu na Raspberry Pi. Program używa GPIO w sposób, który wymaga uruchomienia programu jako root.Na przykład, uruchomić program, który napisałem tak:

sudo ./foo 

zapomniałem to jednak podczas uruchamiania debugera i spróbował

gdb foo 

I mam ten błąd wydaje się nie spotkałem :

Program received signal SIGABRT, Aborted. 
0x76cd0f70 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 

Gdy uruchomiłem go za pomocą sudo, działało dobrze.

sudo gdb foo 

Mam nadzieję, że jest to pomocne dla kogoś w tej samej łodzi.

Powiązane problemy