Найти ошибку memcpy с помощью gdb
Ошибка в следующем коде заключается в том, что memcpy(t[j], m[j], sizeof(int) * DIM * DIM);
должно быть memcpy(t[j], m[j], sizeof(int) * DIM);
:
// Untitled7.c
#include <stdio.h>
#include <string.h>
#define DIM 1000
int main(void)
{
int m[DIM][DIM], t[DIM][DIM];
unsigned j, k;
for(j = 0; j < DIM; j++)
for(k = 0; k < DIM; k++)
m[j][k] = j * DIM + k;
for(j = 0; j < DIM; j++)
memcpy(t[j] ,m[j], sizeof(int) * DIM * DIM); // only one DIM
for(j = 0; j < DIM; j++)
for(k = 0; k < DIM; k++)
m[j][k] = t[DIM-k-1][j];
return 0;
}
Используя GDB, как я могу найти эту ошибку? Я понял, как создать файл ядра (используя ulimit -c unlimited
), тогда я использовал $ gdb Untitled7 core
и это дает:
...
Reading symbols from Untitled7...done.
[New LWP 10610]
Core was generated by ` ? @ A'. // and symbols of binary files
Program terminated with signal SIGSEGV, Segmentation fault.
#0 __memcpy_ssse3 () at ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S:2590
2590 ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S: File o directory non esistente. // File or directory not existent.
После чего мне делать?
1 ответ
Вы не всегда можете найти настоящую ошибку таким образом, но вы можете найти, где произошло нарушение сегментации.
Вам необходимо скомпилировать вашу программу с отладочной информацией и желательно без оптимизации, т.е. использовать -ggdb -O0
флаги компиляции. Если нарушение находится внутри библиотечной функции, как в вашем примере, используйте gdb
команда up
перемещаться вверх по стеку вызовов, пока вы не прибудете в свой код. Вы должны увидеть оскорбительную строку программы.
Удостовериться gdb
можете найти ваши источники. Обычно, когда ваш текущий каталог является вашим каталогом сборки, gdb
могу найти их. Если нет, используйте directory
командование gdb
,