Valigrind и GDB - ваш друг
Пожалуйста, предоставьте весь код, чтобы мы могли скомпилировать его и помочь вам. Смотреть на источник - не магический подход к отладке:)
Убедитесь, что вы компилируете с параметрами отладки (-g и т. Д.) Вашего компилятора.
В противном случае, проверьте memcheck Вальгринда. Когда у вас будет скомпилированная программа, запустите:
valgrind ./myprogram
И вы можете получить вывод, подобный следующему:
==584== Use of uninitialised value of size 8
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584==
==584== Invalid write of size 4
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==584==
==584==
==584== Process terminating with default action of signal 11 (SIGSEGV)
==584== Access not within mapped region at address 0x0
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584== If you believe this happened as a result of a stack
==584== overflow in your program's main thread (unlikely but
==584== possible), you can try to increase the size of the
==584== main thread stack using the --main-stacksize= flag.
==584== The main thread stack size used in this run was 10485760.
Выключить GDB с помощью:
gdb ./myprog
затем введите r возврат
И вы получите больше информации о том, где именно произошла ошибка:
(gdb) r
Starting program: /home/aiden/tmp/a.out
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400480 in segfaultme (p=0x0) at p.c:6
6 *p = 22;
Missing separate debuginfos, use: debuginfo-install glibc-2.11.2-1.x86_64
(gdb) bt
#0 0x0000000000400480 in segfaultme (p=0x0) at p.c:6
#1 0x000000000040049c in main () at p.c:13
Ввод b t return также даст вам обратную трассировку. В приведенном выше примере мы видим, что строка 6 из p.c
в segfaultme()
, где разыменование p
является проблемой, и показывает, что segfaultme()
был вызван main()
.
Надеюсь, это поможет! Не забудьте получить как можно больше инструментов, которые вам помогут!