php段错误coredumped,GDB调试源码以及出现段错误核心已转存的错误如何借助core dump文件去解决问题...

GCC是GUN编译器集合(GNU Compiler Collection)可以编译C、C++、JAVA等语言

gcc是C编译器(GCC中的GUN C Compiler)

g++是C++编译器(GCC中的GUN C++ Compiler)

编写源文件 hello.cpp

#include int main() { std::cout<>nummber; for(int i = 0; i < 10; i ++) { nummber += i; std::cout << "nummber + i = " << nummber << std::endl; } return 0;}

编译源文件 hello.cpp

g++ -g hello.cpp -o hello

gdb调试可执行程序hello

gdb hellorun

c6d2a074877232c8a67e2106ef8fd9bc.png

常用gdb命令解析

start开始执行程序,在main函数的第一条语句前面停下来

list显示多行源代码

print打印内部变量值

whatis变量或函数显示某个变量或函数的类型

set variable设置变量的值

break行号 设置断点,程序运行到断点的位置会停下来

continue继续程序的运行直到遇到下一个断点

kill终止正在调试的程序

quit退出 gdb 调试

watch在程序中设置一个监测点监视变量值的变化

display跟踪查看某个变量每次停下来都显示它的值

delete行号 删除一个断点或监测点

step执行下一条语句如果该语句为函数调用则进入函数执行其中的第一条语句

finish如果已经进入了某函数而想退出该函数返回到它的调用函数可使用该命令

next单步执行不可跟踪到函数内部

jump在源程序中的另一点开始运行

设置core dump文件的大小不受限制

sudo gedit /etc/security/limits.conf

更改后如下图所示

50a72c194c5c91d521acb7e7c278abc5.png

设置core dump文件保存位置和名字格式

sudo gedit /etc/sysctl.conf

添加

kernel.core_pattern = /home/q/下载/core.%e-%p-%t

更改后如下图所示

7aee62ea316ee689d7d7de50c457f6ad.png

命令含义

%e - insert coredumping executable name into filename%p - insert pid into filename 添加pid(进程id)%t - insert UNIX time that the coredump occurred into filename

使更改生效

sudo sysctl -p

造成segment fault,产生core dump的可能原因

1.内存访问越界

a) 错误的下标,导致数组访问越界

b) 搜索字符串时,字符串没有正常的使用结束符

c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp

应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

2.多线程程序使用了线程不安全的函数

3.多线程读写的数据未加锁保护

4.非法指针

a) 使用空指针

b) 随意使用指针转换

5.堆栈溢出

不要使用大的局部变量,这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

模拟 core dump 例子

#include "stdio.h"int main(void){printf("hello world! dump core for set value to NULL pointer/n");*(char *)0 = 0;return 0;}

g++ -g dump_test.cpp -o dump_test

./dump_test

生成如下文件

f760c52d4a73d17cec095c96ce3babb5.png

用gdb查看core文件

发生core dump之后, 用gdb进行查看core文件的内容,

以定位文件中引发core dump的行

gdb [exec file] [core file]gdb dump_test core.dump_test-6918-1594483613

backtracebt 查看函数调用的信息堆栈

backtrace n = bt n

n 是一个正整数表示只打印栈顶上n层的栈信息

-n 表一个负整数表示只打印栈底下n层的栈信息

如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。

framen 查看栈帧

n 是一个从 0 开始的整数,是栈中的层编号

比如:frame 0,表示栈顶

frame 1,表示栈的第二层

upn 表示向栈的上面移动 n 层,可以不打 n,表示向上移动一层。

downn

表示向栈的下面移动n层,可以不打n,表示向下移动一层。

上面的命令,都会打印出移动到的栈层的信息。

7b632699ed1e36c3492da6449aa55b52.png

详细实践操作视频教程

cmake编译器使用教程合集

添加小助手微信可以进入微信和QQ交流群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值