Странный очевидный порядок выполнения при отладке программы с помощью Valgrind/GDB
Прошло много времени с тех пор, как я использовал Valgrind больше, чем для быстрых тестов, и я столкнулся с чем-то, чего я не совсем понял, пытаясь отладить программу, написанную на C. Я не уверен, что это что-то не так с моим кодом или просто что-то "низкого уровня", о котором я не знаю.
Выполняется следующий фрагмент кода (данные являются структурой):
...
data = initialise();
setup(data);
printf("Hi2");
evolve(data);
...
где настройка заканчивается
...
printf("Setup done.\n");
printf("Hi1");
}
но то, что печатает Valgrind
valgrind --vgdb=yes --track-origins=yes ./a.out config
есть (до этого ошибок нет; все заданные значения данных печатаются корректно без проблем.)
...
Setup done.
==3886== Use of uninitialised value of size 8
==3886== at 0x402BF2: evolve (generic_evolution.c:25)
==3886== by 0x400AD3: main (main.c:19)
==3886== Uninitialised value was created by a stack allocation
==3886== at 0x400B54: initialise (main.c:28)
==3886==
==3886== Invalid write of size 4
==3886== at 0x7FF0001C0: ???
==3886== by 0x400AD3: main (main.c:19)
==3886== Address 0xae00000007ff0004 is not stack'd, malloc'd or (recently) free'd
==3886==
==3886==
==3886== Process terminating with default action of signal 11 (SIGSEGV)
==3886== General Protection Fault
==3886== at 0x7FF0001C0: ???
==3886== by 0x400AD3: main (main.c:19)
Hi1Hi2
...
После этого печатаются первые несколько printfs из evolve и программа преждевременно завершает работу. Если я запускаю его без Valgrind, то происходит сбой с segfault сразу после "Установка завершена", без печати Hi1. Более того, если я запускаю программу с GDB и делаю
bt full
Я могу видеть не только содержимое данных, но и переменные, объявленные в начале эволюции, даже если кажется, что установка еще не "действительно" завершена. Согласно gdb, segfault вызвано чем-то, что я не могу увидеть (компилирование с -g; другие переменные отображаются просто отлично):
Finished setup.
Program received signal SIGSEGV, Segmentation fault.
0x00007fffffffe200 in ?? ()
(gdb) bt full
#0 0x00007fffffffe200 in ?? ()
No symbol table info available.
...
(prints data and variables declared in evolve)
Кто-нибудь случайно не знает / не может догадаться, почему кажется, что ошибка возникает в evolve, до того, как последний printf в настройке будет напечатан в stdout (и при нормальном выполнении segfault происходит в таком странном месте, между двумя простыми printfs)?