2011-10-04 17 views
5

Napotkałem błąd segmentacji przewodowej. Zajmuję się tworzeniem oprogramowania w C przy użyciu Eclipse CDT. Podczas uruchamiania mojego programu na terminalu (Ubuntu 10, 64bits), po prostu zgłasza "Błąd segmentacji". Jednak kiedy debuguję używając gdb w Eclipse, to idzie do końca, a wynik jest poprawny.Błąd segmentacji podczas pracy, ale powodzenie podczas debugowania

Rozumiem, że może być wiele przyczyn błędów segmentacji. Przykro mi, że nie mogę pokazać kodu, ponieważ nie wiem, gdzie może być problem ...

Ale czy ktoś mógłby mi pomóc, czy istnieje jakakolwiek sytuacja, która mogłaby się zdarzyć w moim przypadku: błąd segmentacji na terminalach, a dobrze w debugowaniu? Dzięki wielkie.


Dzięki, wszystkie. Spędziłem trochę czasu na uczeniu się valgrind. Naprawiłem błąd, zastępując malloc() przez realloc(). Po wywołaniu następuje dwa memcpy. Czy to jest powód? Oto kod fragmentu kodu:

bwa_seq_t *merge_seq (bwa_seq_t *s1, bwa_seq_t *s2) { 
    ubyte_t *seq1, *seq2, *tmp; 
    if (!s1 || !s2) 
    return 0; 
    seq1 = s1->seq; 
    seq2 = s2->seq; 
    tmp = (ubyte_t*) calloc (sizeof(ubyte_t), (s2->len + s1->len + 1)); 
    memcpy(tmp, seq1, sizeof(ubyte_t) * s1->len); 
    memcpy(&tmp[s1->len], seq2, sizeof(ubyte_t) * s2->len); 
    s1->len += s2->len; 
    tmp[s1->len] = '\0'; 
    s1->seq = tmp; 
    return s1; 
} 

Czy ktokolwiek może pomóc wyjaśnić, dlaczego?

+0

Prawdopodobne uszkodzenie stosu i/lub sterty. Upewnij się, że włączasz pełne ostrzeżenia na kompilatorze i radzisz sobie z nimi wszystkimi. Niedopasowane argumenty do 'printf' i podobne rzeczy są rzeczami, na które należy zwrócić uwagę. – Mat

+2

Uruchom program pod adresem [valgrind] (http://valgrind.org/), problem prawdopodobnie stanie się oczywisty. – Hasturkun

Odpowiedz

9

Spróbuj wykonać następujące czynności:

  • typ ulimit -c unlimited w xterm (ta pozwala na tworzenie rdzenia/pliki postmorterm)

  • rozpocząć swój program (i pozwolić upaść) plik core powinien teraz być obecny w katalogu.

  • launch debugger z gdb <yourprogram> <corefile>

  • typu bt w wierszu gdb zobaczyć na co linia to miało awarię.

  • (opcjonalnie) popraw błąd.

+0

To w zasadzie jest odpowiedź lsalamona. 1 minuta później ^^ –

+2

Er, tak. Ale ta odpowiedź wydaje mi się bardziej wyczerpująca. – Joy

0

Jest to prawdopodobnie wynik niezainicjowanej zmiennej. (W linii 14 programu)

+0

Dlaczego linia 14, w szczególności? – Hasturkun

+2

Musiałem zgadywać; PO nie wykazał żadnego odpowiedniego źródła. – wildplasser

0

Skompiluj z informacjami debugowania i użyj gdb do zidentyfikowania miejsca występowania błędu za pomocą zrzutu.

0

Jest bardzo prawdopodobne, że uderzasz w niezdefiniowane zachowanie. Jak już powiedzieli inni, użyj Valgrind, aby rozwiązać ten problem. Przede wszystkim poszukaj INVALID READ, INVALID WRITE błędy w wynikach Valgrind. Wyświetli także dodatkowe stosy wywołań, gdy w kodzie pojawią się złe rzeczy. Powinno to pomóc w zrozumieniu przyczyny błędu.

0

Też miałem do czynienia z tym problemem przedtem. Nie w Linuksie z kompilatorem GCC, ale w Visual studio 2005. To było tak, mój kod został pomyślnie uruchomiony w trybie debugowania, podczas gdy w trybie wydania (Direct running) się zawiesza. Faktem jest, że podczas debugowania kodu debugger dba o wyjątki takie jak naruszenie dostępu, tablica poza związanymi itd. I nie pozwala na awarię kodu. W trybie bezpośrednim nie ma nikogo, kto by zajął się wyjątkami, a więc kod ulega awarii.

Proponuję użyć printf do wyświetlenia wyniku operacji pośredniej, ponieważ jest to najlepszy sposób na awarię twojego kodu.

Nadzieja to by Ci pomóc .. :-)

0

BTW: masz wyciek pamięci tutaj. s1-> seq w zasadzie się ponownie przenosi, ale zapominasz uwolnić starą pamięć. Zmiana:

s1->len += s2->len; 
tmp[s1->len] = '\0'; 
s1->seq = tmp; 
return s1; 

do:

void *del; // <<-- 
s1->len += s2->len; 
tmp[s1->len] = '\0'; 
del = s1->seq; // <<-- 
s1->seq = tmp; 
free (del); // <-- 
return s1; 

i przynajmniej będziesz zatrzymać wyciek.

Powiązane problemy