首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Linux上获得错误核心转储

今天小编要跟大家分享文章关于Linux错误核心转储问题。喜欢Linux操作系统,对Linux感兴趣小伙伴快来看一看吧,希望通过本篇文章能够有所收获。 首先我们来说一说什么错误?...“错误(segmentation fault)”指你程序尝试访问不允许访问内存地址情况。...这个“C++ 虚表指针”程序发生错误情况。我可能会在未来博客中解释这个,因为我最初并不知道任何关于 C++ 知识,并且这种虚表查找导致程序错误情况也是我所不了解。...当您程序出现错误Linux 内核有时会把一个核心转储写到磁盘。 当我最初试图获得一个核心转储时,我很长一时间非常沮丧,因为 – Linux 没有生成核心转储!我核心转储在哪里?...ASAN 另一种搞清楚您错误方法使用 AddressSanitizer 选项编译程序(“ASAN”,即 $CC -fsanitize=address)然后运行它。

4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux信号】三:信号捕捉

    注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本Unix和不同版本Linux中可能有不同行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...实际上一个回调函数。 sa_mask 调用信号处理函数时,所要屏蔽信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,临时性设置。实际上就是执行捕捉函数期间临时屏蔽信号集。...(sa_flags设置为0时,使用sa_handler动作) sa_restorer 该元素过时,不应该使用,POSIX.1标准将不指定该元素。...实际上这样,未决信号集中使用某一位0和1来记录信号是否被处理,所以不管这个信号被发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次...2.2 内核如何捕捉信号 我们拿上面的程序为例,程序正常执行时候,应该是一直在循环体内打印一句话,直到有信号产生 while(1) { printf("pid: %d\n", getpid

    14210

    Linux信号】一:信号概念、信号产生

    这些信号都有一些共同点:一简单;而是不能携带大量信息;三满足某个特设条件才发送。 信号信息载体,Linux/UNIX 环境下,古老而经典通信方式, 现在依然主要通信手段。...硬件异常产生,如:非法访问内存(错误)、浮点型错误、除0(浮点数例外)、内存对齐出错(总线错误)、SIGPIPE 命令产生,如:kill命令 3.2 信号状态 产生: 递达:递送并且到达进程。...3.3 信号处理方式 执行默认动作 忽略(丢弃) 捕捉(调用户处理函数),捕获可以说是学习信号最重要原因之一,当我们程序产生比如错误、总线错误等等,程序会异常终止,我们通过捕获可以捕获到这种错误...3.4 PCB中信号相关信息 Linux内核进程控制块PCB一个结构体task_struct,除了包含进程id、状态、工作目录、用户id、组id、文件描述符表、还包含了信号相关信息,主要指阻塞信号集和未决信号集...硬件异常信号 当程序出现硬件异常会产生信号: 除0操作,浮点型错误,8号信号SIGFPE。 非法访问内存,11号信号SIGSEGV,错误。 总线错误,7号信号SIGNUS。 3.

    9310

    如何优雅调试错误

    摘要:当程序运行出现错误时,目标文件没有调试符号,也没配置产生 core dump,如何定位到出错文件和函数,并尽可能提供更详细一些信息,如参数,代码等。.../a.out Segmentation fault (core dumped) 可以看到发生了错误。...整行代码意思要把 rdi 寄存器某个偏移处数据复制给 eax 寄存器,前面我们知道引起错误原因 用户态程序,读内存越界,原因是非法地址,而不是没权限,所以就是说读取 0xc0(%rdi) 发生错误...由此我们大概知道这里读取函数第一个参数某个偏移量,推测第一个参数一个结构,这个偏移量结构某个成员,而这个结构地址目前个无效地址,所以取偏移量会引起读取内存出错。...= -1) return -1 看函数名感觉判断当前流 FILE 是否宽字节流,推测从 FILE 结构里取信息,结果 FILE 结构地址非法,所以内存读取错误,直接就错误了。

    4.6K52

    Linux错误(核心已转储)(core dumped)问题分析方法

    前言 在Linux系统中,程序运行时可能会遇到错误(Segmentation Fault),这是一种常见运行时错误,通常由于程序试图访问其内存空间中未分配(或不允许)部分时发生。...错误就是指访问内存超出了系统所给这个程序内存空间,通常这个值由gd tr来保存,他一个48位寄存器,其中32位保存由它指向 gdt表,后13位保存 相应于gdt下标,最后3位包括了程序是否在内存中以及程序在...cpu中运行级别,指向 gdt由以64位为一个单位表,在这张表中就保存着程序运行代码以及数据 一旦一个程序发生了越界访问,cpu就会产生相应保护,于是segmentation fault...就出现了通过上面的解释,错误应该就是访问了不可访问内存,这个内存区要么不存在,要么受到系统保护,还有可能缺少文件或者文件损坏。...注意事项 及时更新系统和工具:确保使用最新版本操作系统、编译器和调试工具。 详细记录错误信息:记录错误发生时完整堆栈跟踪和其他相关信息。 多角度分析:从代码、数据和运行环境多个角度分析问题。

    2.8K10

    Linux

    Linux Intel 微处理器机制从8086 开始提出, 那时引入机制解决了从CPU 内部 16 位地址到20 位实地址转换。...这不仅简化了Linux 内核设计,而且为把Linux 移植到其他平台创造了 条件,因为很多RISC 处理器并不支持机制。但是,对机制相关知识了解进入Linux 内核必经之路。...Linux 这样设计所带来好处显而易见,Intel 部件对Linux 性能造成影响可以忽略不计。...寄存器与选择子 寄存器CS 、DS 、ES 、FS 、GS 、SS ,在实模式下时,中存储基地址,即内存起始地址。...而在保护模式下时,由于基址已经存入了描述符中,所以寄存器中再存放基址没有意义,在寄 存器中存入一个叫作选择子东西– selector。

    4.6K20

    初谈Linux信号-=-信号产生

    忽略快 递(快递拿上来之后,扔掉床头,继续开一把游戏) 快递到来整个过程,对你来讲异步,你不能准确断定快递员什么时候给你打电话 Linux信号Linux操作系统中通过kill -l命令可查看所有的信号...: 信号从1号开始,从信号1到信号31普通信号,从信号35到信号64称之为实时信号,一般不考虑实时信号。...信号Linux系统提供一种向指定进程发送特定事件一种方式,系统在收到信号时会做识别和处理。...进程有自己PCB,一个结构体,在结构体中有很多成员变量,信号给进程发送信号在进程中用位图保存收到信号。...野指针错误:当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。 总结: 终止进程实际上释放进程上下文数据,包括溢出标志数据或者其他异常数据。

    8010

    Linux信号保存

    1 前言 上一篇文章讲到信号怎样产生: 通过kill命令:向指定进程发送指定信号 键盘可以产生信号:我们常用ctrl + c (2号信号)和 ctrl + (3号信号)都可以向进程发送信号 系统调用...对应6号信号(终止会打印Aborted!)其特殊性质可以被捕捉,但是进程还是会被终止掉,就是为了防止发生所有信号都被捕捉,没有信号可以终止情况,9号信号和19号信号不能被自定义捕捉!!!...hanlder表函数指针数组。handler表中下标信号编号,内容收到对应信号会执行方法。...对信号操作 我们认识了内核数据结构中三张表,那么如果对它们进行操作呢?Linux操作系统为我们提供了用户级别的位图!...sigset_tLinux操作系统提供一个用户级数据类型,禁止用户直接修改位图!!!

    9110

    Linux信号处理

    注意handler表函数指针表,传入参数一定是函数指针类型!!!...内存中,操作系统在启动时就会维护一张函数指针数组(中断向量表),数组下标中断号,数组内容读磁盘函数,读网卡函数等方法。每个硬件都有自己中断号,键盘也是。...来看Linux内核: 在操作系统主函数中,首先是进行一些初始化(包括系统调用方法),然后就进入到了死循环!...有很多概念,所以简单单来讲:做到这些需要硬件CPU配合,在CPU中存在一个寄存器code semgent记录代码起始与终止地址。就可以通过两个cs寄存器来分别储存用户与操作系统代码!...struct sigaction *oldact: 输出型参数,获取更改前数据 我们写一代码来看看: // 创建一个进行,进入死循环 // 对2号信号进行自定义捕捉 void handler(int

    9310

    Linux笔记(15)| Linux信号

    今天要分享Linux信号机制,信号一种软件中断,一种处理异步事件方法,可以很好地在多个进程之间进行同步和简单数据交换。...二、信号注册和响应 前面讲了三种发送信号方式,但是光发送信号还不够,对于接收方来说,还得对信号进行处理。 一般可以使用signal函数和sigaction函数来注册信号。...再看signal这个函数,他有两个输入参数,第一个int类型,第二个一个函数指针,另外,他返回也是一个函数指针。 只有对函数指针非常熟悉,才能看懂上面这个表达式。...signal函数第一个参数信号类型,第二个参数函数指针,也就是跳转到哪里去执行。也就是说,当收到第一个参数表示信号之后,就会跳转到第二个参数指向代码去执行。...成员sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号更详细信息。

    2.6K10

    常见C编程错误及对策

    再有一点就是,参数出现错误并非本函数有问题,而是调用者传过来实参有问题。assert 宏可以帮助我们定位错误,而不是排除错误。...这样只会使你代码可移植性下降。 三、内存分配成功,但并未初始化 犯这个错误往往由于没有初始化概念或者是以为内存分配好之后其值自然为0。...五、内存泄漏 内存泄漏几乎很难避免,不管老手还是新手,都存在这个问题。甚至包括windows,Linux 这类软件,都或多或少有内存泄漏。...也就是说,在程序中malloc 使用次数一定要和free 相等,否则必有错误。这种错误主要发生在循环使用malloc 函数时,往往把malloc 和free 次数弄错了。...解决办法重新设计程序,改善对象之间调用关系。 上面详细讨论了常见六种错误及解决对策,希望读者仔细研读,尽量使自己对每种错误发生原因及预防手段烂熟于胸。

    1.5K41

    由于版本依赖造成YUM错误

    查了一些资料,大体上说是由于Zlib版本造成。查看了一下,发现最近确实安装了zlib1.2.5版本,而造成了YUM依赖问题。...尝试重新编译安装了zlib1.2.3,但是结果还是错误。...仔细一看,发现zlib其实并没有将so安装到/usr/local/lib目录下,在/usr/lib下搜索了一下,找到了这个so,不清楚是什么时候安装,拷贝到/usr/local/lib目录下,然后重新进行了一次编译安装...总结:问题应该出在zlib版本更新上,但是应该和zlib软件本身代码没什么关系,只是在软链接配置上改变,对yum造成了影响。...参考资料: 1、yum segmentation fault in centos 2、YUM错误Centos Segmentation Fault @import url(http://www.cnblogs.com

    1.4K20

    错误等造成死机问题分析

    这种方法效率低,而且有时不准确,比如一个系统中有多个进程,但A进程跑B断点,出现错误,系统发出11号信号,造成B,C等进程接到11号信号反初始化而推出。...简单情况: 从OOPS知道PC指针,如果该进程没有调用库,可以直接将该进程反汇编 objdump -D -S  xxx进程名>124.txt 再从123.txt找到该PC指针位置对于C代码行,即可定位...首先看pc指针地址确认在死在内核态和用户态。...注意该进程以及改进程所在库编译必需加-g ,也不能strip,否则反汇编出来没有C代码映射行 如果在内核空间,可以通过堆栈回溯法进程回溯。该方法需要熟悉汇编,其次需要耐心,这里不详述。...方法三:coredump分析法 对于死机问题,某些情况下OOPS打印出来信息不足以分析。coreDump给了个详细方法。

    1.2K20

    Linux】 进程信号发生

    我们可以看看在Linux系统下信号信号时从 1 - 64 数字对应信号(32 - 64 实时信号,暂不考虑) 信号生命周期可以划分为:预备 -> 产生 -> 保存 -> 处理 。...我们把这个过程研究明白就可以了 2 信号概念基础储备 信号Linux系统通过一种向目标进程发送指定事件方式。要做识别和处理。...那么OS怎样知道进程进行非法操作呢?以浮点数错误为例: 在CPU 运算中,数据储存在内存中。...错误也是硬件问题,空指针无法通过页表(实际上MMU内存管理模块进行操作)映射到物理地址,会发生错误!...CR3 - 控制寄存器3: 包含页目录基址寄存器(PDBR),用于存储页目录表物理地址,分页机制关键组成部分。 错误地址会放入CR2中 , 触发故障。

    10010

    Linux】详解信号保存&&信号屏蔽字设置

    被阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作。 注意:阻塞和忽略不同,只要信号被阻塞就不会递达,而忽略在递达之后可选一种处理动作。...常规信号在递达之前产生多次只计一次,也就是说,当在一时间内有多个相同信号到来但却来不及被处理时,在pending位图里只会记录一次。而实时信号在递达之前产生多次可以依次放在一个队列里。...SIG_SETMASK:设置当前信号屏蔽字为set所指向值,相当于mask=set。 第二个参数set我们设置信号屏蔽字,第三个参数为输出型信号屏蔽字,原来信号屏蔽字。...3.3、设置信号屏蔽字例子 下面一个设置屏蔽2号信号,有解除屏蔽2号信号例子。...= -1) { std::cout << "设置屏蔽字错误!"

    12110

    如何读取Linux进程中代码和数据

    Linux程序文件格式ELF,里面分了各种,有代码、数据、等。当运行这个程序时,系统也会给这个进程创建虚拟内存,然后把ELF中数据分别加载到内存中对应位置。...Ptrace Ptrace一个Linux系统提供一个功能强大API接口,可以让一个进程跟踪或控制另一个进程,调试程序GDB就是在这个系统调用基础上开发。.../proc/pid/mem mem内核创建虚拟文件,Linux”一切皆文件”在进程上体现,但是这个文件无法直接进行读取,需要先利用ptrace进行绑定操作。.../proc/pid/maps 下图Linux进程内存布局,这是系统给进程虚拟出一个内存空间,并不是实际物理内存,maps文件中就记录了虚拟内存每段地址分别对应什么数据。...这个文件前三列分别是代码、rodata数据、和普通数据,可以看到代码权限读和执行,rodata数据只读,普通数据可读写。

    3.8K20

    错误之memset对类对象误用

    ,使用memset将对象实体置为0之后,在使用delete析构该对象,就会出现莫名其妙错误。...错误指访问内存超出了系统给这个程序所设定内存空间,考虑到导致错误常见两种情况: (1)访问系统保护内存地址,如向地址0写入数据。 (2)内存越界,如数组越界。...当然还有其他情况,如访问了不存在内存地址。总而言之,错误出现是因为对内存空间不正确操作。...基于对错误理解,本以为对 dicOriTask处理过程中有不正确操作,但是几经周折排查后并未发现错误,莫名其妙,原来问题很简单。memset对类对象误用。...这就是使用memset对类对象误用。即delete一个被 memset为空带有虚函数类对象指针时,就会出现错误

    1.5K10
    领券