用gdb查找memcpy错误

问题描述 投票:0回答:1

以下代码中的错误是

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.

之后我该怎么办?

c segmentation-fault gdb coredump
1个回答
1
投票

您不能总通过这种方式找到真正的错误,但您可以找到发生分段违规的位置。

您需要使用调试信息编译程序,最好不进行优化,即使用

-ggdb -O0
编译标志。如果违规发生在库函数内部(如您的示例所示),请使用
gdb
命令
up
向上移动调用堆栈,直到到达代码。然后您应该会看到程序的有问题的行。

确保

gdb
可以找到您的来源。通常当你的当前目录是你的构建目录时,
gdb
可以找到它们。如果没有,请使用
directory
gdb
命令。

© www.soinside.com 2019 - 2024. All rights reserved.