linux段错误(linux查看错误日志)
linux c 段错误如何定位
1.段错误是什么
一句话来说,段错误是指访问的内存超出了系统给这个程序所设bai定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。这里贴一个对于“段错误”的准确定义(参考Answers.com):
A segmentation fault(often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed(e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.
Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used,"segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.
On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.
2.段错误产生的原因
2.1访问不存在的内存地址
#include<stdio.h>
#include<stdlib.h>
void main()
{
int*ptr= NULL;
*ptr= 0;
}
2.2访问系统保护的内存地址
#include<stdio.h>
#include<stdlib.h>
void main()
{
int*ptr=(int*)0;
*ptr= 100;
}
2.3访问只读的内存地址
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char*ptr="test";
strcpy(ptr,"TEST");
}
2.4栈溢出
#include<stdio.h>
#include<stdlib.h>
void main()
{
main();
}
等等其他原因。
3.段错误信息的获取
程序发生段错误时,提示信息很少,下面有几种查看段错误的发生信息的途径。
3.1 dmesg
dmesg可以在应用程序crash掉时,显示内核中保存的相关信息。如下所示,通过dmesg命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈指针地址、错误代码、错误原因等。以程序2.3为例:
panfeng@ubuntu:~/segfault$ dmesg
[ 2329.479037] segfault3[2700]: segfault at 80484e0 ip 00d2906a sp bfbbec3c error 7 in libc-2.10.1.so[cb4000+13e000]
3.2-g
使用gcc编译程序的源码时,加上-g参数,这样可以使得生成的二进制文件中加入可以用于gdb调试的有用信息。以程序2.3为例:
panfeng@ubuntu:~/segfault$ gcc-g-o segfault3 segfault3.c
3.3 nm
使用nm命令列出二进制文件中的符号表,包括符号地址、符号类型、符号名等,这样可以帮助定位在哪里发生了段错误。以程序2.3为例:
panfeng@ubuntu:~/segfault$ nm segfault3
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
080484dc R _IO_stdin_used
w _Jv_RegisterClasses
08049f10 d __CTOR_END__
08049f0c d __CTOR_LIST__
08049f18 D __DTOR_END__
08049f14 d __DTOR_LIST__
080484ec r __FRAME_END__
08049f1c d __JCR_END__
08049f1c d __JCR_LIST__
0804a014 A __bss_start
0804a00c D __data_start
08048490 t __do_global_ctors_aux
08048360 t __do_global_dtors_aux
0804a010 D __dso_handle
w __gmon_start__
0804848a T __i686.get_pc_thunk.bx
08049f0c d __init_array_end
08049f0c d __init_array_start
08048420 T __libc_csu_fini
08048430 T __libc_csu_init
U __libc_start_main@@GLIBC_2.0
0804a014 A _edata
0804a01c A _end
080484bc T _fini
080484d8 R _fp_hw
080482bc T _init
08048330 T _start
0804a014 b completed.6990
0804a00c W data_start
0804a018 b dtor_idx.6992
080483c0 t frame_dummy
080483e4 T main
U memcpy@@GLIBC_2.0
3.4 ldd
使用ldd命令查看二进制程序的共享链接库依赖,包括库的名称、起始地址,这样可以确定段错误到底是发生在了自己的程序中还是依赖的共享库中。以程序2.3为例:
panfeng@ubuntu:~/segfault$ ldd./segfault3
linux-gate.so.1=>(0x00e08000)
libc.so.6=>/lib/tls/i686/cmov/libc.so.6(0x00675000)
/lib/ld-linux.so.2(0x00482000)
linux signal 11 是什么意思
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。一、信号的基本概念本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件。基本概念对于理解和使用信号,对于理解信号机制都特别重要。下面就来看看什么是信号。 1、基本概念软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。 2、信号的类型发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:(1)与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。(2)与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。(3)与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。(4)与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。(5)在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。(6)与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。(7)跟踪进程执行的信号。 Linux支持的信号列表如下。很多信号是与机器的体系结构相关的,首先列出的是POSIX_sec= 1; value_usec= 0; value_sec= 1; value_usec= 0; setitimer(ITIMER_REAL,&value,&ovalue); value2_sec= 0; value2_usec= 500000; value2_sec= 0; value2_usec= 500000; setitimer(ITIMER_VIRTUAL,&value2,&ovalue); for(;;);}该例子的屏幕拷贝如下: localhost:~$./timer_test process id is 579 Catch a signal– SIGVTALRM Catch a signal– SIGALRM Catch a signal– SIGVTALRM Catch a signal– SIGVTALRM Catch a signal– SIGALRM Catch a signal–GVTALRM
罪魁查找Linux下段错误的罪魁linux定位段错误的是
随着Web开发技术的进步,Linux系统日益受欢迎,用户数量在增长。但是,随着Linux的发布,同样也带来了潜在的错误。每个开发者都有责任仔细检查和修正其中的错误。
首先,Linux系统出错时会产生日志文件,如/var/log/messages等,这是我们第一步要查看的。通常情况下,系统会在其中添加一些跟踪消息,可以用来分析哪里有错误。
其次,Unix和Linux系统都提供了task manager来监控系统资源。系统中存在无效的进程或消耗系统资源过多的进程,都可能导致程序出现错误。
再次,我们也可以使用Linux的strace工具来查找错误罪魁,strace也是一个DEBUG工具,可以详细地看到系统调用的步骤,可以检测出错误值的归属。例如,假设我们要调试一个叫a.out的程序,可以使用strace:
strace-o a.out.strace
a.out
最后,我们还可以使用Linux系统自带的dmesg命令来检查缓冲区和日志,过滤出错误信息。例如,如果我们想看到系统中5分钟内出现的所有错误日志:
dmesg| grep“\(error\|fail\|fault\)”–after=-5m
总而言之,为了定位Linux系统中出现的错误,我们可以使用上述工具来确定错误罪魁。然而,在处理完错误后,还有必要查找其中的原因,并根据不同的场景,对问题进行深入的检查和分析,以提高Linux系统的健壮性和可靠性。