首页 > 系统相关 >【Linux】调试常见的应用程序奔溃“Segmentation fault (core dumped)”

【Linux】调试常见的应用程序奔溃“Segmentation fault (core dumped)”

时间:2023-12-15 21:45:13浏览次数:35  
标签:__ core Segmentation fault dumped kbytes gdb size

https://blog.csdn.net/hello_nofail/article/details/129994481?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170264661316800227454508%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170264661316800227454508&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-9-129994481-null-null.142^v96^pc_search_result_base6&utm_term=linux%20%E4%B8%ADSegmentation%20fault&spm=1018.2226.3001.4187

 

前言
Linux程序开发者,日常遇到程序奔溃时,应该如何调试,如何寻找原因和解决呢?本文就介绍了遇到Segmentation fault (core dumped)问题时最常规的定位方法。

一、确保产生core文件
当你在命令行执行一个程序时,遇到Segmentation fault (core dumped)后,第一时间查看当前目录下是否产生了core-xxxxx文件。

如果没有产生core文件,以ubuntu20.0为例:

查询OS当前最core file size的配置:
root@x-System-Product-Name:~# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 62634
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 62634
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
如果上图结果中的core file size是0,则需要进行步骤2设置。否则略过步骤2。

放开core file size(非永久生效)
ulimit -c unlimited
1
设置core文件名格式
echo "core-%e-%p-%t" > /proc/sys/kernel/core_pattern
1
禁用OS自带的apport服务(ubuntu专有)
sudo systemctl disable apport.service
1
运行你的程序,比如:
./build/example/testing
1
二、利用core文件,调试确认terminated位置
root@Name:/home# gdb build/examples/testing core-testing-1119167-1680772401
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 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 build/examples/testing...
[New LWP 1119167]
[New LWP 1119250]
[New LWP 1119251]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./build/examples/testing'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 printf (__fmt=0x564c2c7d48e0 "data miscompare! lba[%lu]. rmt data[%xh]. local data[%xh]\n")
at /usr/include/x86_64-linux-gnu/bits/stdio2.h:107
107 return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
[Current thread is 1 (Thread 0x7f89a7611980 (LWP 1119167))]
(gdb) Quit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
由上图,一目了然,程序奔溃在一行printf语句。另外可以还可以敲bt查看调用栈!你学会了吗?

附上gdb常用方法

l(list) ,显示源代码,并且可以看到对应的行号;
b(break)x, x是行号,表示在对应的行号位置设置断点;
p(print)x, x是变量名,表示打印变量x的值
r(run), 表示继续执行到断点的位置
n(next),表示执行下一步
c(continue),表示继续执行
q(quit),表示退出gdb 启动gdb,注意该程序编译需要-g选项进行。
————————————————
版权声明:本文为CSDN博主「hello_nofail」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hello_nofail/article/details/129994481

标签:__,core,Segmentation,fault,dumped,kbytes,gdb,size
From: https://www.cnblogs.com/wcxia1985/p/17904221.html

相关文章

  • EFCore 实体的配置FluentAPI(3)
    上一篇文章简述了如何使用EFCore的CodeFirst进行数据库创建并实现简单的增删改查,这章我们讨论一些复杂的配置:实体配置实体配置目的:生成想要的表格类型,如表名,表的列名,表字段类型,长度等,下图是上一章EFCore生成的表 实体配置遵循约定大于配置的原则:就是说EFCore这个ORM框架已经......
  • EFCore CodeFirst(2)
    目的:使用EFCore的CodeFirst实现简单的增删改查,只注重流程搭建,不涉及到比较复杂的配置和应用等Nuget包安装:Micosoft.EntityFrameworkCore:EFCore基础包Micosoft.EntityFrameworkCore.SqlServer:该系列文章使用SQLServer数据库,因此需要引用这个包,如果是其它数据库,查找对应的包安......
  • 【HMS Core】应用内支付热门问题
     【问题描述1】如何获取退款进度以及结果?【解决方案】可以集成v2通知事件,这样会发送退款通知。可以根据此通知了解退款时间。https://developer.huawei.com/consumer/cn/doc/HMSCore-References/api-notifications-about-subscription-events-v2-0000001385268541【问题描述2】订......
  • asp.net core 使用newtonsoft完美序列化WebApi返回的ValueTuple
    https://www.cnblogs.com/kugar/p/12334210.html   由于开发功能的需要,又懒得新建太多的class,所以ValueTuple是个比较好的偷懒方法,但是,由于WebApi需要返回序列化后的json,默认的序列化只能将ValueTuple定义的各个属性序列化成Item1...n  但是微软还是良心的为序列......
  • EFCore 简介(1)
    EFCore是微软的一个ORM框架,全称:Microsoft.EntityFrameworkCoreORM(ObjectRelationalMapping):对象关系映射,让开发者用对象的形式操作关系数据库常用的ORM框架:EF、EFCore、Dapper、SqlSugar、Freesql每种ORM都有自己的优缺点EFCore有两种模式:DBFirst(数据库优先)和CodeFirst(代码优......
  • 解决.net core开发过程中端口总是无缘无故被占用的问题,提示SocketException: 以一种访
    先给出原因和方案:  是Hyper-V每次启动随机保留端口段,导致所要使用的端口被系统保留,导致无法使用的问题解决方法就是,指定系统保留端口的范围,避开开发时使用的端口即可。powershell管理员身份使用下面的命令设置。netshintipv4setdynamictcpstart=49152nu......
  • 如何生成core文件进行项目调试
    由于项目前期的调试错误比较多,或者有某些隐藏危险:例如内存泄漏;偶尔才出现一次,如果没有捕捉错误的手段可能好不容易出现的机会就溜走了,所以生成core文件是必要的,发生段错误会生成相应的core文件,使用gdb可以查询错误原因和堆栈情况。生成core文件那么如何在程序发生段错误时生成co......
  • .net core 分布式锁 之 基于 Redis 的 RedLock
    使用场景分布式锁的业务场景涉及到并发控制、任务调度、缓存更新、分布式事务和防止重复操作等方面,能够保证分布式系统的数据一致性和正确性。并发控制:当多个线程或进程同时访问共享资源时,使用分布式锁可以确保只有一个线程或进程能够访问该资源,避免数据竞争和并发冲突。分......
  • Asp.net core Net6.0 Webapi 项目如何优雅地使用内存缓存
    前言缓存是提升程序性能必不可少的方法,Asp.netcore支持多级缓存配置,主要有客户端缓存、服务器端缓存,内存缓存和分布式缓存等。其中客户端缓和服务器端缓存在使用上都有比较大的限制,而内存缓和分布式缓存则比较灵活。内存缓存就是一种把缓存数据放到应用程序内存中的机制。本......
  • .net core 同步锁/异步锁
    一、同步锁privatestaticreadonlyobject_lock=newobject();///同步锁publicvoidTestLock(){lock(_lock){//需要处理的业务Console.Write("输出内容");......