segfault ? ? ?
segfault ? ? ?
Använder gcc utan ++. Kompilerar utan att ange någon -O. Debuggar med gdb. Nedanstående felutskrift ör fullständigt värdelös. Antar den försvinner in i något systemlib och fastnar. Listan slutar innan det kommer något namn på funktioner i mitt program även om den får skriva ut allt den har.
Hur skall jag göra för att få något användbart?
Program received signal SIGSEGV, Segmentation fault.
0x0000002000000020 in ?? ()
(gdb) bt
#0 0x0000002000000020 in ?? ()
#1 0x000000200000007c in ?? ()
#2 0x0000002000000020 in ?? ()
Hur skall jag göra för att få något användbart?
Program received signal SIGSEGV, Segmentation fault.
0x0000002000000020 in ?? ()
(gdb) bt
#0 0x0000002000000020 in ?? ()
#1 0x000000200000007c in ?? ()
#2 0x0000002000000020 in ?? ()
Re: segfault ? ? ?
Du kan testa att köra strace, den kan ge åtminstone grovt var det ballar ur.
Re: segfault ? ? ?
Program received signal SIGSEGV, Segmentation fault.
0x0000002000000020 in ?? ()
(gdb) strace
warning: Couldn't determine the static tracepoint marker to probe
Static tracepoint 1 at 0x2000000020
(gdb)
Det där var inte bättre. Får jag bara veta vilken funktion i mitt program som innehåller felet har det hittills varit möjligt att hitta det.
0x0000002000000020 in ?? ()
(gdb) strace
warning: Couldn't determine the static tracepoint marker to probe
Static tracepoint 1 at 0x2000000020
(gdb)
Det där var inte bättre. Får jag bara veta vilken funktion i mitt program som innehåller felet har det hittills varit möjligt att hitta det.
Re: segfault ? ? ?
Du får ta till det gamla knepet att logga i programmet.
Förutsätter att du gör kontroll av indata med typ assert() i alla dina funktioner.
Förutsätter att du gör kontroll av indata med typ assert() i alla dina funktioner.
Re: segfault ? ? ?
Nu var det ett tag sedan, men är det inte type "gcc -g" för att gå debug symbols i binären?
Re: segfault ? ? ?
sommarlov har helt rätt, bygg med -g. Om det är svårt att single steppa i gdb så rekommenderas -Og istf -O2/3/s osv.
-
- Inlägg: 1407
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: segfault ? ? ?
-Og är även bättre än -O0 (ie. inget -O)
Optimize debugging experience. -Og should be the optimization level of choice for the standard edit-compile-debug cycle, offering a reasonable level of optimization while maintaining fast compilation and a good debugging experience. It is a better choice than -O0 for producing debuggable code because some compiler passes that collect debug information are disabled at -O0.
Re: segfault ? ? ?
strace är inte i gdb, Det är ett unix-kommando. Skriv strace framför programnamnet när du startar: % strace koolprog
Och gegug-flaggan slår man på reflexmässigt när det trasslar.
Och gegug-flaggan slår man på reflexmässigt när det trasslar.
Re: segfault ? ? ?
Segfaulten är fixad nu, den fanns i den funktion där jag anade att den var, men antagligen var det optimeringen som dolde den.
Hade lagt till en puts("in")/puts("out") i början/slutet och båda exekverades, så då är segfaulten ju på ett annat ställe. FEL! Den var i raden innan puts("out")... Compilern placerade inte raderna i rätt ordning. Det lurade mig att börja leta på andra ställen
Jäkla oskick. Tänk om det istället varit t.ex. två skrivningar till en port. Den första med data, den andra med klockpuls. Det hade inte fungerat.
Hade lagt till en puts("in")/puts("out") i början/slutet och båda exekverades, så då är segfaulten ju på ett annat ställe. FEL! Den var i raden innan puts("out")... Compilern placerade inte raderna i rätt ordning. Det lurade mig att börja leta på andra ställen

Jäkla oskick. Tänk om det istället varit t.ex. två skrivningar till en port. Den första med data, den andra med klockpuls. Det hade inte fungerat.
Re: segfault ? ? ?
Är inte så ju med alla dessa subtila småsaker innan de blivit självklarheter. För hårdvarunära program kan ordningsföljd vara väldigt viktigt, men det får vänta tills om och när något blir aktuellt...
Re: segfault ? ? ?
Självklart kan ordningsföljd vara viktigt, men om man skriver korrekt kod för det så rör inte kompilatorn ordningen. Även om det förekommer, så är det högst otroligt att en modern (stabil version) GCC skulle optimera sönder sådan kod.