Что может вызвать ошибку сегментации при простом вводе функции?SIGSEGV при вводе функции
вошла функция выглядит следующим образом:
21: void eesu3(Matrix & iQ)
22: {
где Matrix
является struct
. При работе с помощью GDB трассировка производит:
(gdb) backtrace
#0 eesu3 (iQ=...) at /home/.../eesu3.cc:22
#1 ...
GDB не говорит, что iQ
есть. ...
буквально там. Что может быть причиной этого?
GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Программа построена с -O3 -g
Вызывающий абонент не идет, как:
Matrix q;
// do some stuff with q
eesu3(q);
Ничего особенного здесь
Я перепрограммировал программу с помощью valgrind:
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes <prgname>
Выход:
==2240== Warning: client switching stacks? SP change: 0x7fef7ef68 --> 0x7fe5e3000
==2240== to suppress, use: --max-stackframe=10076008 or greater
==2240== Invalid write of size 8
==2240== at 0x14C765B: eesu3(Matrix &) (eesu3.cc:22)
...
==2240== Address 0x7fe5e3fd8 is on thread 1's stack
==2240==
==2240== Can't extend stack to 0x7fe5e2420 during signal delivery for thread 1:
==2240== no stack segment
==2240==
==2240== Process terminating with default action of signal 11 (SIGSEGV)
==2240== Access not within mapped region at address 0x7FE5E2420
==2240== at 0x14C765B: eesu3(Matrix&) (eesu3.cc:22)
==2240== If you believe this happened as a result of a stack
==2240== overflow in your program's main thread (unlikely but
==2240== possible), you can try to increase the size of the
==2240== main thread stack using the --main-stacksize= flag.
==2240== The main thread stack size used in this run was 8388608.
Похоже, его поврежденным стека.
Dump of assembler code for function eesu3(Matrix &):
0x00000000014c7640 <+0>: push %rbp
0x00000000014c7641 <+1>: mov %rsp,%rbp
0x00000000014c7644 <+4>: push %r15
0x00000000014c7646 <+6>: push %r14
0x00000000014c7648 <+8>: push %r13
0x00000000014c764a <+10>: push %r12
0x00000000014c764c <+12>: push %rbx
0x00000000014c764d <+13>: and $0xfffffffffffff000,%rsp
0x00000000014c7654 <+20>: sub $0x99b000,%rsp
=> 0x00000000014c765b <+27>: mov %rdi,0xfd8(%rsp)
Хорошо, чтобы было ясно: данные Матрицы живут в куче. Он в основном содержит указатель на данные. Структура мала, 32 байта. (Только что проверил)
Теперь я перестроил программу с различными вариантами оптимизации:
-O0
: ошибка не отображается.
-O1
: ошибка показывает.
-O3
: ошибка показывает.
--update
-O3 -fno-inline -fno-inline-functions
: ошибка не отображается.
Это объясняет это. Слишком много встроенных функций привело к чрезмерному использованию стека.
Проблема была из-за переполнения стека в
Чтобы посмотреть на переменные и т. Д., Не оптимизируйте. Компилировать с '-O0 -g' – RageD
Stack corp? – Benj
Хорошо, перестроим с помощью '-O0 -g'. Проходит некоторое время. – ritter