如何在 C 和 C++ 中查找分段错误?(使用 GDB)
c++server side programmingprogramming
分段错误是运行时错误之一,它是由于内存访问冲突而导致的,例如访问无效数组索引、指向某些受限制的地址等。在本文中,我们将了解如何使用 GDB 工具检测此类错误。
让我们查看代码和相应的步骤来定位错误。
示例
#include <stdio.h> main() { int* ptr = NULL; *ptr = 1; //尝试访问未知的内存位置 printf("%p\n", ptr); }
使用‘gcc –g program_name.c’编译代码,并使用‘./a.out’运行
输出
soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ ./a.out Segmentation fault (core dumped))
发生分段错误。
写入‘gdb ./a.out core’
soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ gdb ./a.out core GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./a.out...done. /home/soumyadeep/Cpp_progs/core: No such file or directory. (gdb)
输入 ‘r’ 并按回车键。
Starting program: /home/soumyadeep/Cpp_progs/a.out Program received signal SIGSEGV, Segmentation fault. 0x000055555555465e in main () at 1230.find_seg_error.c:5 5 *ptr = 1; //trying to access unknown memory location (gdb)
至此我们成功获取错误信息,现在退出 GDB
(gdb) quit A debugging session is active. Inferior 1 [process 2794] will be killed. Quit anyway? (y or n) y