debug-段错误

同一台电脑使用模拟ModbusTcp主从通讯的时候,Wireshark抓取不到包 在使用ModBus Slave和Poll模拟主从通讯的时候,发现Wireshark怎么都抓取不到包怎么排查和解决? 阅读详情

大多数的linux发型版本关闭了内核转存储功能,使用:

ulimit  -c 

查看自己的linux内核是否关闭了核心转存储功能;

andrew@andrew-Thurley:/proc/net$ ulimit -c
0

输出为0 说明内核关闭了核心转存储功能,-c选项表示内核转存储文件的大小限制,使用如下命令可以放开内核转存储功能:

ulimit -c unlimited

这个命令是不限制内核转存储文件的大小,但是内存有限的情况下可能会想限制一下内核转存储文件的大小,可以使用以下命令设置内核转存储文件的大小,如下命令限制内核转存储文件的大小为1G;

ulimit -c 1073741824
  1. ulimit -c

查看系统的核心转存储是否被限制为0 ,若是被限制为0使用

  1. ulimit -c unlimited

将核心转存储设置为无限制

  1. 编译程序加上-g 选项

  2. 调试
    要想使用GDB调试内核转存储文件,应当以以下方式启动GDB

gdb -c core文件 ./a.out

在使用大型文件系统时,会希望将内核转存储放在固定的位置。默认情况下会在当前目录下生成,但是可能很难弄清文件在哪在哪生成。这种情况下可以配置/etc/systl.conf文件,来决定文件的生成目录和文件的命名;

例如在/etc/systl.conf 文件中添加如下内容:
kernel.core_pattern = /var/core/%t-%e-%p-%c.core
kernel.core_uses_pid = 0
然后执行

sysctl -p

上述生成核心转存储文件的命名:
时刻-进程名-PID-内核转存储最大大小.core
kernel.core_pattern中可以设置的格式符:

格式符                    说明
%%		          %字符自身
%p                        被转存储进程的进程ID(PID)
%u                        被转存储进程的真实用户ID(real UID)
%g                        被转存储进程的真实组ID(real GID)
%s                        引发转存储的信号编号
%t                        转存储时刻(从1970年1月1日 0:00 开始的秒数)
%h                        主机名(同uname(2)返回的nodename)
%e                        可执行文件名
%c                        转存储文件的大小上限(内核版本2.6.24以后可以使用)

kernel.core_uses_pid = 0 设置为0是因为我们改变了文件名中的PID的位置,如果设置该值为1,文件名末尾就会添加.PID


segment.c文件示例

andrew@andrew-Thurley:/work/linux-sys/DEBUG/segmentation$ gdb -c core ./segment
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 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 ./segment...done.
[New LWP 7103]
Core was generated by `./segment'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000004004ed in main (argc=1, argv=0x7ffcab228948) at segment.c:16
16	    (*a) = 1;
(gdb) bt full
#0  0x00000000004004ed in main (argc=1, argv=0x7ffcab228948) at segment.c:16
        a = 0x0
(gdb) bt
#0  0x00000000004004ed in main (argc=1, argv=0x7ffcab228948) at segment.c:16
(gdb) frame 0
#0  0x00000000004004ed in main (argc=1, argv=0x7ffcab228948) at segment.c:16
16	    (*a) = 1;

(gdb) disassemble 0x00000000004004ed
Dump of assembler code for function main:
   0x00000000004004d6 <+0>:	push   %rbp
   0x00000000004004d7 <+1>:	mov    %rsp,%rbp
   0x00000000004004da <+4>:	mov    %edi,-0x14(%rbp)
   0x00000000004004dd <+7>:	mov    %rsi,-0x20(%rbp)
   0x00000000004004e1 <+11>:	movq   $0x0,-0x8(%rbp)
   0x00000000004004e9 <+19>:	mov    -0x8(%rbp),%rax
=> 0x00000000004004ed <+23>:	movl   $0x1,(%rax)
   0x00000000004004f3 <+29>:	mov    $0x0,%eax
   0x00000000004004f8 <+34>:	pop    %rbp
   0x00000000004004f9 <+35>:	retq   
End of assembler dump.
(gdb) list
11	
12	    int *a = NULL;
13	
14	
15	
16	    (*a) = 1;
17	
18	
19	
20	    return 0;

GDB list命令可以查看函数周围的源代码

可以看出代码在中为指向NULL的指针赋值,产生段错误;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
加粗样式
4.使用内核转储掩码来排除要转储的内存块
你可能会因为不希望设置ulimit 的时候太僵硬导致空间不够没有得到完整的转储,所以设置ulimit 为"unlimited" (不限制)。但是如果执行一个占用内存很恐怖的程序,当这个程序内核转储的时候也就会生成体积很恐怖的转储文件。

为了避免这种情况,可以指定内核转储掩码来排除要转储的内存段。

掩码请查看/usr/src/linux/Documentation/sysctl/kernel.txt 中的3.4 小节,没有内核源码可以到这里的网络版,这里摘录出来如下:

The following 7 memory types are supported:

  • (bit 0) anonymous private memory(匿名私有内存段)
  • (bit 1) anonymous shared memory(匿名共享内存段)
  • (bit 2) file-backed private memory(file-backed 私有内存段)
  • (bit 3) file-backed shared memory(file-bakced 共享内存段)
  • (bit 4) ELF header pages in file-backed private memory areas (it is
    effective only if the bit 2 is cleared)(ELF 文件映射,只有在bit 2 复位的时候才起作用)
  • (bit 5) hugetlb private memory(大页面私有内存)
  • (bit 6) hugetlb shared memory(大页面共享内存)

设置方法很简单:找到程序的PID,然后修改/proc/PID/coredump_filter 的值。

如果你要设置某些还没有运行的进程的内核转储掩码,请修改/proc/self/coredump_filter 的值。

PS:

a. 默认的coredump_filter 的值一般是0x23,至于代表什么,请换成二进制00100011,从右向左看,bit 0、bit 1、bit 5 被置位,也就是说会转储所有的匿名内存段和大页面私有内存段。

b. 共享内存段都是一样的,可以不必转储。

  1. 在系统中全局设置转储功能
    全局设置没有什么好说的,把你的配置写入/etc/profile.d/ 目录下任意一个新建的文件当中,别忘了设置属组和所有者为root:root,权限为751。

根据上面说的,写入的要有一条ulimit 指令,可能还有一条sysctl 指令,最后可能还有一条cat 指令。

更多的设置请查看上面提到的kernel.txt 和proc.txt,例如你想把SUID 程序也转储,你需要

sysctl -w 'fs.suid_dumpable=1'

在这里插入图片描述

手把手教你用ObjectCRX进行Caxa二次开发:从零开始的环境搭建教程 本文是一份面向零基础初学者的Caxa二次开发实战指南,重点讲解如何使用ObjectCRX框架从零开始搭建开发环境。内容涵盖Visual Studio 2015版本锁定、ObjectCRX向导集成、项目创建、典型错误解决,并最终实现一个可在Caxa中运行的HelloWorld程序,帮助开发者快速入门并避开常见陷阱。 阅读详情

相关推荐

手把手教你用Anaconda安装李沐d2l-zh包(附常见报错解决方案)

本文提供了一份详尽的Anaconda环境下安装李沐d2l-zh包的实战指南。文章从创建虚拟环境、配置国内镜像源加速下载入手,分步讲解核心依赖的预安装策略,并重点剖析了安装过程中常见的报错及其解决方法,旨在帮助初学者和开发者高效、稳定地搭建深度学习实验环境。

efc1234567的博客 1010

怎么解决这个错误:API server listening at: 127.0.0.1:34767 2023-01-11T14:30:02+08:00 error layer=debugger gnu...

这个错误说明程序无法打开配置文件./res/configuration.toml。 在这个情况下,您应该确保该文件存在并且程序有权访问它。 另外,错误消息还指出了 "gnu_debuglink CRC check failed",这可能是由于库文件已经损坏或者版本不匹配导致的。建议重新安装或升级库文件再次尝试。 ...

weixin_42577735的博客 1552

告别蓝牙音质妥协:用ESP32和PCM5102搭建WiFi无损音频播放器(附完整代码)

本文详细介绍了如何利用ESP32微控制器和PCM5102 DAC芯片构建一套完整的WiFi无损音频流媒体系统,彻底摆脱蓝牙协议的音质束缚。从硬件原理到软件实现,包括核心器件选型、电路设计、I2S音频驱动实现以及系统优化方案,帮助音频发烧友实现高保真无线音频传输。

weixin_30733003的博客 541

Golang不能使用debug模式启动了

如题,报错如下: GOROOT=/usr/local/go #gosetup GOPATH=/home/gxl/go #gosetup /usr/local/go/bin/go build -o /tmp/___go_build_study_array_test -gcflags "all=-N -l" study/array-test #gosetup /usr/local/GoLand-201...

小白的成长之路 5620

非root用户如何在CentOS7集群上编译安装OpenFOAM6

本文详细介绍了在CentOS7集群上以非root用户身份编译安装OpenFOAM6的完整流程。通过环境准备、依赖包离线获取、源码编译安装等步骤,解决了集群环境下权限和依赖问题,特别针对OpenMPI和Boost库提供了优化配置建议,帮助用户高效完成安装并优化性能。

weixin_28826961的博客 681

各种加法器的比对分析与Verilog实现(3)

了Kogge-Stone加法器和brent-kung加法器,本文将用Verilog代码进行实现。

Albert_yeager的博客 1197

轻松解决报错:/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found

其实是缺少libstdc++.so.6.0.29。我的办法:下载所需lib版本并建立软连接。看了好多帖子都没解决,总结一下解决过程。可在bash输入下列代码查看现有版本。第三步,cd到下载路径下再执行。(前提,获得sudo权限)第二步,移除现有软连接。第四步,重新建立软连接。

A_Turnip的博客 8831

信息抽取实战:三元组抽取(限定领域 vs 开放领域)(附代码)

信息抽取实战:三元组抽取 目录信息抽取实战:三元组抽取一、限定领域的三元组抽取比赛介绍数据分析序列标注模型关系分类模型三元组提取总结开放领域的三元组抽取标注平台文本分类新数据进行三元组抽取总结参考文献 一、限定领域的三元组抽取   本项目将会介绍在2019语言与智能技术竞赛的三元组抽取比赛方面的一次尝试。由于该比赛早已结束,当时也没有参加这个比赛,因此没有测评成绩,我们也只能拿到训练集和验证集。但是,这并不耽误我们在这方面做实验。 比赛介绍   该比赛的网址为:http://lic2019.ccf.org.

南有芙蕖 2万+

嵌入式linux gdb调试(段错误调试)

1. 下载gdb ftp://ftp.gnu.org/gnu/gdb 2. 交叉编译 tar -xvv gdb-7.12.1.tar.gz ./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --prefix=`pwd`/_install make make install 编译完成后我们把gdb可执行文件拷贝到目标板上 3. ulimit 打开core文件 ulimit -c unlimited 打开core

gmq_syy的博客 562

【UV打印机】PrintExp打印软件教程(六)-高级模式(马达)

输入高级模式密码进入高级模式高级模式界面有操作栏、控制栏、参数栏及参数界面操作栏名称功能说明文件加载数据从板卡加载参数保存将参数保存到主板退出退出高级模式固件导入固件导入配套版本下的固件配置*xpcfx导出固件导出当前使用的固件配置*xpcfx导入波形文件导入对应的波形文件*waf操作初始化系统继续初始化动作复位X轴复位回原点控制栏可进行小车运动、闪喷操作(此闪喷为点击进行闪喷,不受平台位置限制),无清洗功能。

Print World的专栏 3112

【医学图像分割网络】之Res U-Net网络PyTorch复现

【医学图像分割网络】之Res U-Net网络PyTorch复现 1.内容 U-Net网络算是医学图像分割领域的开山之作,我接触深度学习到现在大概将近大半年时间,看到了很多基于U-Net网络的变体,后续也会继续和大家一起分享学习。这次分享ResNet+U-Net的一个改进版,ResNet本身就是一个十分优秀的backbone,目前应用仍然十分广泛,我们融合进ResNet后,我们就可以使得U-Net进行迁移学习了。 1.将Resnet作为encoder替换U-Net原始结构 2.U-Net提出时间较早,当时还没

qq_39071739的博客 1万+

gdb 调试段错误

利用运行时产生core文件,再利用GDB调试找出段错误在哪一行 ulimit -c unlimited 使用该bash命令,可以使运行时段错误产生core文件。 1.gcc -g 编译 gcc -g -o a a.c 2.执行文件,便会产生一个core.xxx文件 ./a 3. 调试core文件 gdb ./a core.xxx 便可以直接查看出段错误出错在哪一行 ...

qq_19249035的博客 534

3步!Spring Boot+OCR引擎秒提身份证/营业执照?手把手教你从零实现!

OCR技术革新文档识别效率 本文演示了如何利用Spring Boot+Tesseract OCR+OpenCV构建自动化文档识别系统。相比传统人工录入,OCR技术可实现: 5秒极速提取身份证/营业执照关键信息 精准识别中文文本(准确率90%+) 正则过滤自动匹配结构化数据 技术要点: OpenCV图像预处理(灰度化+二值化) Tesseract多语言OCR识别 正则表达式精准提取证件号码 效率提升达100倍,错误率降低90%,适用于金融、政务等需要批量处理证件的场景。

java专栏 903

段错误debug方法

段错误debug方法段错误debug方法 段错误debug方法 1.gdb gdb ./hellworld r bt 查看断点 2.ulimit -c unlimited 如果有段错误生成 core gdb ./hellworld core bt 3. echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern ulimit -c unlimited 如果有段错误生成 core gdb ./hellworld core bt ..

嵌入式与人工智能 441

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

程序异常终止、段错误、debug与run的结果不一样

问题描述:今天在写数据结构的实验时,发现我的程序在debug正确运行,而run的时候会出现程序异常终止或者是段错误,就算有时运气好成功运行出来的结果也是不一样。 问题原因:某个指针未进行空间分配就进行使用,某个变量未赋初值就使用。 总结:要养成对新建的指针进行内存分配的习惯,注意细节。 ...

m0_52847482的博客 1013

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

debug段错误 (核心已转储)

python -X faulthandler file.py

前行居士 153

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Qt一个Debug的项目,调用一个Release的动态库,出现段错误。

你们有没有出现过这样的问题: 一个动态库,一个调用这个动态库的项目,都是用Qt编写的。但是这样的情况会运行段错误:动态库release版,调用者Debug版   答:  肯定报错啊   编译环境都不一样  问: 那调用的动态库都是Release的,我这项目是不是没有办法调试了 答: 调试 release版本的 问:  release 断点都断不上呢

行走在路上 2222

【Debug】Linux 下 EasyConnect 段错误排查+远程使用校园网

含 gdb 回溯、GTK/Harfbuzz 兼容性、VNC 与 SOCKS5 代理。

lxm1905915的博客 772

线段树之:【段错误树debug】【线段树的段错误分析】【持续更新】

线段树的段错误分析

bei2002315的博客 406

clion:调试段错误

1 debug模式编译源代码 2 由于项源码从硬件读取数据,多线程并行执行,故未设置断点,由程序自由运行 3 修改源码改正段错误,搞定

OceanStar的博客 3164

打印更多的用户态段错误信息

在调试上层程序时,经常会遇到的错误是段错误,当出现段错误时,系统往往只会给出一个 segmention error,而在没有更多的信息(默认不产生core dump),在这种情况下,可以通过修改内核启动参数来使能调试模式,让用户态出现段错误时,打印出更多的提示信息,有助于定位错误。 分析流程: 先从在内核态的段错误出发,当产生内核态的段错误时,通常会打印出如下字段:...

weixin_30369087的博客 103

Linux使用gdb调试段错误

开启core dump记录

Melon的博客 1461

Linux系统中段错误信号sigsegv的捕获和调试使用

本文介绍了在Linux系统中通过捕获信号sigsegv信号debug segmentation fault的方法。 要在程序的执行过程中能捕获段错误发出的信号sigsegv,需要在程序的开始的时候注册信号的处理函数signal(SIGSEGV, sigsegv_handler);并且在信号的处理函数sigsegv_handler中需要调用系统调用backtrace和bacetrace_symbols打印出回溯信息。接下来还需要通过objdump 的命令将程序反汇编成一个.s的汇编文件。然后根据回溯信息和汇

仗劍走天涯 7230

linux打印错误值,linux下打印用户态段错误信息的一种方法

引自:韦东山嵌入式视频第二期 “第31课第3节_应用调试之配置修改内核打印用户态段错误信息_P” 第6分钟起。1.配置内核支持DEBUG_USER (勾选 Kernel hacking -> Verbose user fault messages[*] 即可)(视频第8:23)2.设置bootargs,添加参数 user_debug = 0xFF 即可。user_debug的每一位代表设...

weixin_33122261的博客 887

linux下定位段错误(转)

打开生成core.xxx文件开关:设置ulimit -c unlimited,也可在环境变量中设置,以避免每次打开终端时都要进行设置;执行linux下debug版本的应用程序: ./AppName;程序出现"段错误/已放弃"而退出时,会在当前运行目录下产生 core.xxx文件(其中xxx是一串数字);使用gdb运行core.xxx文件: gdb ./AppName core.xxx;在gdb>下

blackstar8888的专栏 827

1009. clion调试段错误

1 debug模式编译源代码 2 由于项源码从硬件读取数据,多线程并行执行,故未设置断点,由程序自由运行 3 修改源码改正段错误,搞定 ...

写给自己的笔记 881
上一篇: 广播和多播
下一篇: linux开发常用工具集
andrewbytecoder
andrewbytecoder 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 3476粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andrewbytecoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值