Linux段错误(精)
linux 异常进程处理机制 -回复
linux 异常进程处理机制-回复Linux 异常进程处理机制一、引言在Linux操作系统中,异常进程是指在执行期间出现错误或异常的进程。
这些错误或异常可以是由于软件缺陷、资源不足、权限问题或其他系统问题引起的。
为了保证系统的稳定性和安全性,Linux操作系统提供了异常进程处理机制,以便适当地处理这些异常情况,并防止它们对系统造成严重影响。
二、异常进程的分类Linux操作系统将异常进程分为两类:可修复的异常进程和不可修复的异常进程。
可修复的异常进程是指可以通过某种方式修复或恢复正常运行的进程,例如重新启动进程、重新分配资源等。
不可修复的异常进程是指无法通过任何方式修复或恢复正常运行的进程,必须被终止。
三、异常进程处理机制1. 错误检测Linux操作系统会通过监控进程的执行情况来检测是否出现了错误或异常。
这可以通过检查进程返回的错误码、访问权限以及操作系统提供的监控工具来实现。
一旦检测到异常,系统会采取相应的措施来处理。
2. 异常信号Linux操作系统通过向异常进程发送信号来通知它们发生了错误或异常情况。
常见的异常信号包括SIGSEGV(段错误)、SIGFPE(浮点异常)、SIGILL (非法指令)等。
当异常进程接收到信号后,它可以选择忽略、处理或终止。
忽略信号意味着进程将继续执行而不进行任何操作。
处理信号意味着进程会执行一个信号处理函数来处理异常情况。
终止信号意味着进程将被立即终止,不再继续执行。
3. 隔离机制对于可修复的异常进程,Linux操作系统提供了隔离机制来保护系统的其他部分不受其影响。
当出现异常时,操作系统会将异常进程隔离在一个被称为容器的环境中。
容器是一个独立、封闭的执行环境,它与其他部分相互隔离,不会影响其他进程或系统资源。
这种隔离机制可以有效地防止异常进程对系统的进一步破坏,同时允许管理员修复异常进程。
4. 日志记录当异常进程发生时,Linux操作系统还会记录日志以追踪异常情况。
段错误总结
(版权声明:本文欢迎转载,但未经允许不得用于商业目的)
2
Segmentation Fault in Linux
内容提要
本文简单介绍了 Segmentation fault 发生的原因, 结合实 际例子描述了内核向用户态程序发送 SIGSEGV 信号的流 程。 文中以实例回答了常见的一些 SIGSEGV 问 题 ,例如“为 什么函数返回了栈还可以访问?”、“为什么 free()后的内存 仍然 可以使用 ”、“为什 么我遇到的是 SIGSEGV 而不 是 SIGILL 信号”等。最后笔者结合自己的经验,列举了一些预 防 SIGSEGV 的编程习惯,供大家参考。SIGSEGV 严格依赖 操作系统、编译器、硬件平台,本文基于 Linux、GCC、32bit IA32 架构,但对其他平台操作系统也有借鉴意义。
我们引用 wiki 上的一段话来回答这个问题。
A segmentation fault (often shortened to SIGSEGV) is a particular error condition that can occur during the operation of computer software. 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 (for example, attempting to write to a read-only location, or to overwrite part of the operating system). 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 an invalid memory address receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.
Linux命令行中的进程调试和错误排查技巧
Linux命令行中的进程调试和错误排查技巧在Linux系统中,进程调试和错误排查是开发者和系统管理员必备的技能之一。
通过命令行界面,可以使用一系列工具和技巧来定位和解决进程中的错误和问题。
本文将介绍一些常用的Linux命令行中的进程调试和错误排查技巧,帮助读者快速定位和修复问题。
1. 进程的状态查看与管理在Linux系统中,可以通过以下命令查看和管理进程的状态:- `ps`:显示当前运行的进程列表。
可以使用`ps aux`命令查看所有进程的详细信息,包括PID(进程ID)、CPU使用率、内存占用等。
- `top`:实时动态显示进程列表和系统资源的使用情况。
按键盘上的`q`退出。
- `kill`:终止一个正在运行的进程。
使用`kill PID`命令,其中PID 是要终止的进程的ID。
- `killall`:终止指定进程名对应的所有进程。
使用`killallprocess_name`命令,其中process_name是要终止的进程名。
2. 进程的跟踪与调试当进程发生错误或异常时,可以使用以下命令进行跟踪和调试:- `strace`:跟踪系统调用和信号的发生情况。
使用`strace -p PID`命令,其中PID是要跟踪的进程ID。
- `gdb`:GNU调试器,可以对正在运行的进程进行调试。
使用`gdb -p PID`命令,其中PID是要调试的进程ID。
3. 日志分析与查看Linux系统中的日志文件记录了系统和各个进程的运行状态和错误信息。
以下是一些常用的日志文件和查看命令:- `/var/log/messages`:包含系统运行过程中的大量信息。
使用`tail -f /var/log/messages`命令实时查看该文件的最新内容。
- `/var/log/syslog`:包含系统日志信息,包括内核和其他系统组件的消息。
使用`tail -f /var/log/syslog`命令实时查看该文件的最新内容。
Linux下segment fault的调试
Linux下的段错误产生的原因及调试方法简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。
一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了.在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的1)访问系统数据区,尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址2)内存越界(数组越界,变量类型不一致等)访问到不属于你的内存区域解决方法我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。
实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。
但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定位这些"段错误"的语句。
下面将就以下的一个存在段错误的程序介绍几种调试方法:1dummy_function(void)2{3unsigned char*ptr=0x00;4*ptr=0x00;5}67int main(void)8{9dummy_function();1011return0;12}作为一个熟练的C/C++程序员,以上代码的bug应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。
段错误(core dumped)
段错误 (core dumped)当我们的程序崩溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员找到程序出现问题的地方。
最常出现的,几乎所有C程序员都出现过的错误就是“段错误”了。
也是最难查出问题原因的一个错误。
下面我们就针对“段错误”来分析core文件的产生、以及我们如何利用core文件找到出现崩溃的地方。
何谓core文件当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。
core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。
使用core文件调试程序看下面的例子:#includechar *str = "test";void core_test(){str[1] ='T';}int main(){core_test();return0;}编译:gcc –g core_dump_test.c -o core_dump_test如果需要调试程序的话,使用gcc编译时加上-g选项,这样调试core文件的时候比较容易找到错误的地方。
执行:./core_dump_test段错误运行core_dump_test程序出现了“段错误”,但没有产生core文件。
这是因为系统默认core文件的大小为0,所以没有创建。
可以用ulimit命令查看和修改core文件的大小。
ulimit -c 0ulimit -c 1000ulimit -c 1000-c指定修改core文件的大小,1000指定了core文件大小。
也可以对core文件的大小不做限制,如:ulimit -c unlimitedulimit -c unlimited如果想让修改永久生效,则需要修改配置文件,如.bash_profile、/etc/profile或/etc/security/limits.conf。
再次执行:./core_dump_test段错误 (core dumped)ls core.*core.6133可以看到已经创建了一个core.6133的文件.6133是core_dump_test程序运行的进程ID。
Linux出错提示信息详解
Linux出错提示信息详解深入地讲:许多人害怕Linux,因为它给出的出错提示信息简直像天书一样。
并且这样的信息有很多。
如果你在Linux Format(译者注:这是一家英国销售量最好的Linux杂志)的论坛上搜索“Error”这个词,你将会得到超过150页的内容。
那些是许多人遇到的许多问题。
用户们遇到的最大的困难并非出错提示信息的数量,而是如何从中找出有用的东西。
例如,“Kernel Oops”是什么意思,或者“PCI can't allocate”是什么意思?Linux的出错提示相当愚钝且很难理解,几乎起不了什么帮助。
这是一个遗憾,因为大绝大多数问题本可以很容易的解决,而且有相当数量的涉及同样问题的出错提示一次又一次的出现。
用商业圈里的话来说,这是最能获得立竿见影效果的部分(译者:不知些句如此翻译妥当否?请指教)。
我们要解决的正是这一部分问题。
启动你的系统不需要你成为一个Linux专家,播放视频文件也无需成为程序员。
然而大部分出错信息都假定他们的用户已掌握了此类专门技术。
我们试图阐明这些常见错误,并提供解决方案,以帮助普通的Linux用户规避这些问题,并使他们的系统回到正常状态。
我们挑选了一些我们认为问题最多的领域,包括启动、常规软件应用、文件系统、网络和发行版的安装。
我们从每个领域中挑选了几个最常见的错误,并解释了相应的解决方案是如何起作用的。
这样做的目的是,即使这些问题不适合你的情况,你也能了解为什么Linux的出错提示信息看上去如此的难以捉摸并令人生畏。
希望你能从中学会找到解决自己问题所需知识的方法。
发行版的安装每一种Linux发行版都有不同的安装例程,并且都会制造一些问题。
Ubuntu也许在一台电脑上工作良好而另外一台则不行。
一台安装了Ubuntu并运行正常的电脑也许根本无法安装Fedora,OpenSUSE, Linux Mint, 或者Mandriva...ERROR Can't boot from CD/DVD(无法从光盘启动)如何你刚开始接触Linux,下述情况通常会是你对该操作系统的第一体验:你将你的新光盘放入光驱并重启电脑,结果发现却是进入了你先前使用的操作系统。
Linux学习-常见错误和快捷操作
Linux下命令的一些异常情况命令不全:在命令没有输入完 (引号或括号没有配对),就不小心按下了Enter 键,终端会提示出一个>代表命令不完整,这是可以继续输入,也可以ctrl+c 终止输入,重新再来。
(下面sed命令使用时,还有另外一种命令不全的问题)ct@ehbio:~/ehbio_project$ rename 'ehbio2 >'ct@ehbio:~/ehbio_project$ rename 'ehbio2 >^Cct@ehbio:~/ehbio_project$文件名输入错误: 多一个字母、少一个字母、大小写问题ct@ehbio:~/ehbio_project$lsehbio2.fa ehbio3.fa ehbio4.fa ehbio.fa second.fa# 重命名没有生效ct@ehbio:~/ehbio_project$ rename 'ehbio2''ehbio5' ebio2.fact@ehbio:~/ehbio_project$ lsehbio2.fa ehbio3.fa ehbio4.fa ehbio.fa second.fa# 仔细看是ehbio2.fa写成了ebio2.fa,更正后即可。
Z8vb3e9jtel4m99ss6e7eZ:~/ehbio_project$ rename 'ehbio2''ehbio5' ehbio2.fact@ehbio:~/ehbio_project$ lsehbio3.fa ehbio4.fa ehbio5.fa ehbio.fa second.fa所在目录不对: 访问的文件不存在于当前目录,而又没有提供绝对路径, 或软连接失效ct@ehbio:~/ehbio_project$ lsehbio3.fa ehbio4.fa ehbio5.fa ehbio6.fa ehbio.fa second .fact@ehbio:~/ehbio_project$ ls ../dataehbio2.fa first.fa# 当前目录没有ehbio2.fact@ehbio:~/ehbio_project$ less ehbio2.faehbio2.fa: 没有那个文件或目录# ehbio2.fa在上一层目录的data目录下ct@ehbio:~/ehbio_project$ ls ../data/ehbio2.fa../data/ehbio2.fa# 加上路径依然访问不了ct@ehbio:~/ehbio_project$ less ../data/ehbio2.fa../data/ehbio2.fa: 没有那个文件或目录# 上面的问题是软连接失效,在之前的操作中删掉了原始的ehbio2.fa,所以快捷方式失效# 正确的访问ct@ehbio:~/ehbio_project$ tail -n 3 ../data/first.fa ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGCCAGGACAGGAGCTAendLinux终端常用快捷操作•命令或文件名自动补全:在输入命令或文件名的前几个字母后,按Tab键,系统会自动补全或提示补全•上下箭头:使用上下箭头可以回溯之前的命令,增加命令的重用,减少输入工作量•!加之前输入过的命令的前几个字母,快速获取前面的命令ct@ehbio:~/ehbio_project$ cut -f 1-d ' 'ehbio.fa | tail -n 4 >mYCACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGCCAGGACAGGAGCTAendct@ehbio:~/ehbio_project$ man cut # 直接跳到上面运行的cut命令,再执行一次ct@ehbio:~/ehbio_project$ !cut cut -f 1-d ' 'ehbio.fa | tail -n 4 >mYCACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGCCAGGACAGGAGCTAend•ctrl+a回到命令的行首,用于修改常命令或注释掉命令# 写完下面的命令,突然不想运行了,又不想一个个删掉ct@ehbio:~/ehbio_project$ cut -f 1-d ' 'ehbio.fa | tail -n 4# 按ctrl+a, 回到行首,再输入`#`号,回车,命令即被注释掉。
linux编译安装时常见错误解决办法
linux编译安装时常见错误解决办法configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution复制代码代码如下:yum -y install libxslt-develconfigure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.复制代码代码如下:yum -y install net-snmp-develconfigure: error: Please reinstall readline - I cannot find readline.h复制代码代码如下:yum -y install readline-develconfigure: error: Cannot find pspell复制代码代码如下:yum -y install aspell-develchecking for unixODBC support... configure: error: ODBC header file '/usr/include/sqlext.h' not found!复制代码代码如下:yum -y install unixODBC-develconfigure: error: Unable to detect ICU prefix or /usr/bin/icu-config failed. Please verify ICU install prefix and make sure icu-config works.复制代码代码如下:yum -y install libicu-develconfigure: error: utf8mime2text() has new signature, but U8TCANONICAL is missing. This should not happen. Check config.log for additional information.复制代码代码如下:yum -y install libc-client-develconfigure: error: freetype.h not found.复制代码代码如下:yum -y install freetype-develconfigure: error: xpm.h not found.复制代码代码如下:yum -y install libXpm-develconfigure: error: png.h not found.复制代码代码如下:yum -y install libpng-develconfigure: error: vpx_codec.h not found.复制代码代码如下:yum -y install libvpx-develconfigure: error: Cannot find enchant复制代码代码如下:yum -y install enchant-develconfigure: error: Please reinstall the libcurl distribution - easy.h should be in /include/curl/复制代码代码如下:yum -y install libcurl-develLAOGAO added 20140907:configure: error: mcrypt.h not found. Please reinstall libmcrypt.复制代码代码如下:wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gztar zxf libmcrypt-2.5.7.tar.gzcd libmcrypt-2.5.7./configuremake && make installadded 20141003:Cannot find imap复制代码代码如下:ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.soconfigure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing.复制代码代码如下:yum -y install libc-client-develCannot find ldap.h复制代码代码如下:yum -y install openldapyum -y install openldap-develconfigure: error: Cannot find ldap libraries in /usr/lib复制代码代码如下:cp -frp /usr/lib64/libldap* /usr/lib/configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path复制代码代码如下:yum -y install postgresql-develconfigure: error: Please reinstall the lib curl distribution复制代码代码如下:yum -y install curl-develconfigure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.复制代码代码如下:yum -y install net-snmp-develconfigure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution复制代码代码如下:yum -y install libxslt-develchecking for BZip2 support… yes checking for BZip2 in default path… not found configure: error: Please reinstall the BZip2 distribution 复制代码代码如下:yum -y install bzip2-develchecking for cURL support… yes checking if we should use cURL for url streams… no checking for cURL in default path… not found configure: error: Please reinstall the libcurl distribution – easy.h should be in/include/curl/Fix:复制代码代码如下:yum -y install curl-develchecking for curl_multi_strerror in -lcurl… yes checking for QDBM support… no checking for GDBM support… no checking for NDBM support… no configure: error: DBA: Could not find necessary header file(s).Fix:复制代码代码如下:yum -y install db4-develchecking for fabsf… yes checking for floorf… yes configure: error: jpeglib.h not found.Fix:复制代码代码如下:yum -y install libjpeg-develchecking for fabsf… yes checking for floorf… yes checking for jpeg_read_header in -ljpeg… yes configure: error: png.h not found. Fix:复制代码代码如下:yum -y install libpng-develchecking for png_write_image in -lpng… yes If configure fails try –with-xpm-dir=configure: error: freetype.h not found.Fix:复制代码代码如下:Reconfigure your PHP with the following option. --with-xpm-dir=/usrchecking for png_write_image in -lpng… yes configure: error: libXpm.(a|so) not found.Fix:复制代码代码如下:yum -y install libXpm-develchecking for bind_textdomain_codeset in -lc… yes checking for GNU MP support… yes configure: error: Unable to locate gmp.hFix:复制代码代码如下:yum -y install gmp-develchecking for utf8_mime2text signature… new checking for U8T_DECOMPOSE… configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.Fix:复制代码代码如下:yum -y install libc-client-develchecking for LDAP support… yes, shared checking for LDAP Cyrus SASL support… yes configure: error: Cannot find ldap.hFix:复制代码代码如下:yum -y install openldap-develchecking for mysql_set_character_set in -lmysqlclient… yes checking for mysql_stmt_next_result in -lmysqlclient… no checking for Oracle Database OCI8 support… no checking for unixODBC support… configure: error: ODBC header file ‘/usr/include/sqlext.h' not found!Fix:复制代码代码如下:yum -y install unixODBC-develchecking for PostgreSQL support for PDO… yes, shared checking for pg_config… not found configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation pathFix:复制代码代码如下:yum -y install postgresql-develchecking for sqlite 3 support for PDO… yes, shared checking for PDO includes… (cached) /usr/local/src/php-5.3.7/ext checking for sqlite3 files in default path… not found configure: error: Please reinstall the sqlite3 distributionFix:复制代码代码如下:yum -y install sqlite-develchecking for utsname.domainname… yes checking for PSPELL support… yes configure: error: Cannot find pspellFix:复制代码代码如下:yum -y install aspell-develchecking whether to enable UCD SNMP hack… yes checking for default_store.h… nochecking for kstat_read in -lkstat… no checking for snmp_parse_oid in -lsnmp… no checking for init_snmp in -lsnmp… no configure: error: SNMP sanity check failed. Please check config.log for more information.Fix:复制代码代码如下:yum -y install net-snmp-develchecking whether to enable XMLWriter support… yes, shared checking for xml2-config path… (cached) /usr/bin/xml2-config checking whether libxml build works… (cached) yes checking for XSL support… yes, shared configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distributionFix:复制代码代码如下:yum -y install libxslt-develconfigure: error: xml2-config not found. Please check your libxml2 installation.Fix:复制代码代码如下:yum -y install libxml2-develchecking for PCRE headers location… configure: error: Could not find pcre.h in /usrFix:复制代码代码如下:yum -y install pcre-develconfigure: error: Cannot find MySQL header files under yes. Note that the MySQL client library is not bundled anymore!Fix:复制代码代码如下:yum -y install mysql-develchecking for unixODBC support… configure: error: ODBC header file ‘/usr/include/sqlext.h' not found!Fix:复制代码代码如下:yum -y install unixODBC-develchecking for pg_config… not found configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path Fix:复制代码代码如下:yum -y install postgresql-develconfigure: error: Cannot find pspellFix:复制代码代码如下:yum -y install pspell-develconfigure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.Fix:复制代码代码如下:yum -y install net-snmp-develconfigure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distributionFix:复制代码代码如下:yum -y install libxslt-devel。
linux内核异常处理流程
linux内核异常处理流程English Answer:Introduction.In Linux kernel, exceptions are abnormal conditionsthat occur during the execution of a program. They can be caused by hardware faults, software errors, or user-initiated events. The Linux kernel provides a comprehensive mechanism for handling exceptions to ensure systemstability and reliability.Types of Exceptions.There are two main types of exceptions in Linux kernel:1. Hardware Exceptions: These exceptions are caused by hardware faults, such as memory errors, bus errors, or page faults.2. Software Exceptions: These exceptions are caused by software errors, such as division by zero, invalid memory access, or illegal instructions.Exception Handling Process.When an exception occurs, the kernel follows a well-defined exception handling process:1. Exception Entry: The kernel identifies the exception and enters the exception handling code.2. Exception Handling: The kernel performs the necessary actions to handle the exception, such as terminating the process, displaying an error message, or initiating a system crash.3. ExceptionHandler: The kernel calls the appropriate exception handler for the exception type. This handler performs specific tasks to handle the exception.4. Exception Exit: The kernel exits the exceptionhandling code and resumes the execution of the program (if possible).Exception Handlers.The Linux kernel provides a set of predefined exception handlers that are invoked based on the exception type. These handlers include:1. General Protection Fault (GPF): Handles memory protection violations.2. Page Fault (PF): Handles page faults caused by accessing invalid memory.3. Floating-Point Exception (FPE): Handles floating-point errors.4. Invalid Instruction (ILL): Handles illegal instructions.5. Bus Error (BUS): Handles bus errors caused byhardware faults.User-Initiated Exceptions.In addition to hardware and software exceptions, the Linux kernel also supports user-initiated exceptions. These exceptions can be generated by the user through systemcalls or signals.System Calls.System calls are functions that allow user programs to interact with the kernel. Some system calls can generate exceptions, such as the `abort()` call, which terminates the current process with an exit code of `SIGABRT`.Signals.Signals are software interrupts that can be sent to processes by the kernel or other processes. Signals can be used to notify processes of events, such as the receipt of a keyboard or mouse event, or to terminate processes with aspecific exit code.Conclusion.Exception handling is a critical aspect of Linux kernel design. The kernel's comprehensive exception handling mechanism ensures that the system can respond to abnormal conditions in a controlled and reliable manner, maintaining system stability and integrity.Chinese Answer:Linux 内核异常处理流程。
setunhandledexceptionfilter在linux下的替换函数
在Linux 系统中,SetUnhandledExceptionFilter是Windows 平台上的函数,用于设置当未处理的异常发生时的处理程序。
然而,Linux 并没有一个直接对应的函数。
在Linux 中,你可以使用信号(Signals)来处理未处理的异常或错误。
当一个进程收到一个信号时,它可以执行一些操作,例如终止进程或进行某种恢复。
例如,你可以使用signal函数来设置一个信号处理函数。
下面是一个简单的例子,展示了如何设置一个处理SIGSEGV(段错误)的信号处理函数:
c复制代码
#include<signal.h>
#include<stdio.h>
void handle_segv(int signal) {
printf("Caught segmentation fault!\n");
// 可以在这里添加代码进行清理或恢复操作
exit(1);
}
int main() {
// 注册信号处理函数
signal(SIGSEGV, handle_segv);
// 引发段错误的代码(例如访问无效的内存)
// ...
return0;
}
在这个例子中,当程序发生段错误时,handle_segv函数会被调用,然后程序会打印一条消息并退出。
如果你想要捕获所有的信号,你可以使用sigaction函数,或者简单地使用signal函数为所有信号设置相同的处理函数。
但要注意,某些信号是不能被捕获的,例如SIGKILL。
Linux错误处理与错误号
Linux错误处理与错误号每天只要进步一点点!09-11-24小知识:li nux从文本界面启动:首先进入roo t权限,在fedor a下,终端输入:su root;输入你的密码;进入root权限下,使用shell,vi /etc/i nitta b,修改i nitta b文件,把id:5:initd efaul t的5改成3。
其他几种对应的模式如下: 0 关机 1 单用户模式2 多用户模式,但是不支持网络访问 3多用户模式,文本模式启动 4无定义的5 图形化界面 6重启进入图形界面start x,就OK了,当然前提是装了图形界面文件权限:4:读相当于r2:写相当于w1:执行相当二x常用7 可读可写可执行6 可读可写 5 可读可执行 4只可读Linu x错误机制1,在用户进行文件操作的时候,会出各种各样的错误,比如权限不足,空间不足,找不到文件等,此时需在程序中设置错误捕捉语句,并显示错误.在li nux中错误定义成了错误号和错误常数,如果发生错误,便宜会返回在终端上可以用以下命令来查看错误的定义: cat/usr/inclu de/as m/err no.h如下:#i fndef _I386_ERR NO_H#defi ne _I386_E RRNO_H#de fineEPERM 1 /* Ope ratio n not perm itted */#defin e ENO ENT 2 /* N o suc h fil e ordirec tory*/#d efine ESRC H 3/* No such proc ess */#de fineEINTR 4 /* Int errup ted s ystem call */#defin e EIO5 /* I/O er ror */#de fineENXIO 6 /* Nosuchdevic e oraddre ss */#def ine E2BIG 7 /* Arglisttoo l ong */#de fineENOEX EC 8 /* Exe c for mat e rror*/#d efine EBAD F 9/* Ba d fil e num ber */#de fineECHIL D 10 /* Nochild proc esses */#defin e EAG AIN 11 /* T ry ag ain */#de fineENOME M 12 /* Out of m emory */#defin e EAC CES 13 /* P ermis siondenie d */#defi ne EF AULT14 /*Bad a ddres s */#defi ne EN OTBLK15 /*Block devi ce re quire d */#defi ne EB USY 16 /*Devic e orresou rce b usy */#de fineEEXIS T 17 /* Fil e exi sts */#de fineEXDEV 18 /* Cro ss-de vicelink*/#d efine ENOD EV 19/* No such devi ce */#def ine E NOTDI R 20 /* Nota dir ector y */#defi ne EI SDIR21 /*Is adirec tory*/#d efine EINV AL 22/* In valid argu ment*/#d efine ENFI LE 23/* Fi le ta ble o verfl ow */#def ine E MFILE24 /* Toomanyopenfiles */#defin e ENO TTY 25 /* N ot atypew riter */#defin e ETX TBSY 26 /* T ext f ile b usy */#de fineEFBIG 27 /* Fil e too larg e */#defi ne EN OSPC28 /*No sp ace l eft o n dev ice */#de fineESPIP E 29 /* Ill egalseek*/#d efine EROF S 30/* Re ad-on ly fi le sy stem*/#d efine EMLI NK 31/* To o man y lin ks */#def ine E PIPE32 /* Brok en pi pe */#def ine E DOM 33 /* Math argu mentout o f dom ain o f fun c */#defi ne ER ANGE34 /*Mathresul t not repr esent able*/#d efine EDEA DLK 35/* Re sourc e dea dlock woul d occ ur */#def ine E NAMET OOLON G 36 /* File name toolong*/#d efine ENOL CK 37/* No reco rd lo cks a vaila ble */#de fineENOSY S 38 /* Fun ction notimple mente d */#defi ne EN OTEMP TY 39 /*Direc torynot e mpty*/#d efine ELOO P 40/* To o man y sym bolic link s enc ounte red */ #de fineEWOUL DBLOC K EAGA IN /* Ope ratio n wou ld bl ock */#de fineENOMS G 42 /* Nomessa ge of desi red t ype */#de fineEIDRM 43 /* Ide ntifi er re moved */#defin e ECH RNG 44 /* C hanne l num ber o ut of rang e */#defi ne EL2NSYN C 45 /*Level 2 no t syn chron ized*/#d efine EL3H LT 46/* Le vel 3 halt ed */#def ine E L3RST47 /* Leve l 3 r eset*/#d efine ELNR NG 48/* Li nk nu mberout o f ran ge */#def ine E UNATC H 49 /* Prot ocoldrive r not atta ched*/#d efine ENOC SI 50/* No CSIstruc tureavail able*/#d efine EL2H LT 51/* Le vel 2 halt ed */#def ine E BADE52 /* Inva lid e xchan ge */#def ine E BADR53 /* Inva lid r eques t des cript or */#def ine E XFULL54 /* Exch angefull*/#d efine ENOA NO 55/* No anod e */#defi ne EB ADRQC56 /*Inval id re quest code */#defin e EBA DSLT 57 /* I nvali d slo t */#defi ne ED EADLO CK E DEADL K#de fineEBFON T 59 /* Bad font file form at */#def ine E NOSTR60 /* Devi ce no t a s tream */#defin e ENO DATA 61 /* N o dat a ava ilabl e */#defi ne ET IME 62 /*Timer expi red */#de fineENOSR 63 /* Out of s tream s res ource s */#defi ne EN ONET64 /*Machi ne is noton th e net work*/#d efine ENOP KG 65/* Pa ckage notinsta lled*/#d efine EREM OTE 66/* Ob jectis re mote*/#d efine ENOL INK 67/* Li nk ha s bee n sev ered*/#d efine EADV 68/* Ad verti se er ror */#de fineESRMN T 69 /* Srm ounterror */#defin e ECO MM 70 /* C ommun icati on er ror o n sen d */#defi ne EP ROTO71 /*Proto col e rror*/#d efine EMUL TIHOP 72/* Mu ltiho p att empte d */#defi ne ED OTDOT73 /*RFS s pecif ic er ror */#de fineEBADM SG 74 /* Not a da ta me ssage */#defin e EOV ERFLO W 75 /* V aluetoo l argefor d efine d dat a typ e */#defi ne EN OTUNI Q 76 /*Namenot u nique on n etwor k */#defi ne EB ADFD77 /*Filedescr iptor in b ad st ate */#de fineEREMC HG 78 /* Rem ote a ddres s cha nged*/#d efine ELIB ACC 79/* Ca n not acce ss aneede d sha red l ibrar y */#defi ne EL IBBAD80 /*Acces singa cor rupte d sha red l ibrar y */#defi ne EL IBSCN81 /*.libsecti on in a.ou t cor rupte d */#defi ne EL IBMAX82 /*Attem pting to l ink i n too many shar ed li brari es */ #def ine E LIBEX EC 83 /* Cann ot ex ec ashare d lib rarydirec tly */#de fineEILSE Q 84 /* Ill egalbyteseque nce */#de fineEREST ART 85 /* Int errup ted s ystem call shou ld be rest arted */#defin e EST RPIPE 86 /* S tream s pip e err or */#def ine E USERS87 /* Toomanyusers */#defin e ENO TSOCK 88 /* S ocket oper ation on n on-so cket*/#d efine EDES TADDR REQ 89/* De stina tionaddre ss re quire d */#defi ne EM SGSIZ E 90 /*Messa ge to o lon g */#defi ne EP ROTOT YPE 91 /*Proto col w rongtypefor s ocket */#defin e ENO PROTO OPT 92 /* P rotoc ol no t ava ilabl e */#defi ne EP ROTON OSUPP ORT 93 /*Proto col n ot su pport ed */#def ine E SOCKT NOSUP PORT94 /* Sock et ty pe no t sup porte d */#defi ne EO PNOTS UPP 95 /*Opera tionnot s uppor ted o n tra nspor t end point */ #defin e EPF NOSUP PORT 96 /* P rotoc ol fa milynot s uppor ted */#de fineEAFNO SUPPO RT 97 /* Add ressfamil y not supp orted by p rotoc ol */ #def ine E ADDRI NUSE98 /* Addr ess a lread y inuse */#de fineEADDR NOTAV AIL 99 /* Can not a ssign requ ested addr ess */#de fineENETD OWN 100/* Net workis do wn */#def ine E NETUN REACH101 /* Netw ork i s unr eacha ble */#de fineENETR ESET 102/* Net workdropp ed co nnect ion b ecaus e ofreset */ #defin e ECO NNABO RTED 103 /* S oftwa re ca usedconne ction abor t */#defi ne EC ONNRE SET 104 /*Conne ction rese t bypeer*/#d efine ENOB UFS 105/* No buff er sp ace a vaila ble */#de fineEISCO NN 106/* Tra nspor t end point is a lread y con necte d */#defi ne EN OTCON N 107 /*Trans portendpo int i s not conn ected */#defin e ESH UTDOW N 108 /* C annot send afte r tra nspor t end point shut down*/ #d efine ETOO MANYR EFS 109/* To o man y ref erenc es: c annot spli ce */#def ine E TIMED OUT 110 /* Conn ectio n tim ed ou t */#defi ne EC ONNRE FUSED111 /*Conne ction refu sed */#de fineEHOST DOWN 112/* Hos t isdown*/#d efine EHOS TUNRE ACH 113/* No rout e tohost*/#d efine EALR EADY 114/* Op erati on al ready in p rogre ss */#def ine E INPRO GRESS115 /* Oper ation nowin pr ogres s */#defi ne ES TALE116 /*Stale NFSfilehandl e */#defi ne EU CLEAN117 /*Struc tureneeds clea ning*/#d efine ENOT NAM 118/* No t a X ENIXnamed type file */#defin e ENA VAIL 119 /* N o XEN IX se mapho res a vaila ble */#de fineEISNA M 120/* Isa nam ed ty pe fi le */#def ine E REMOT EIO 121 /* Remo te I/O err or */#def ine E DQUOT122 /* Quot a exc eeded */#defin e ENO MEDIU M 123 /* N o med ium f ound*/#d efine EMED IUMTY PE 124/* Wr ong m edium type */#endif通过st rerro r函数来显示错误信息输入以下程序:#inclu de#inclu de#inclu de /*包含错误处理的头文件*/i nt ma in(vo id){print f("EN OENT:\n");c har *mesg= str error(ENOE NT);pr intf(" Er rno :%d\n",ENO ENT);p rintf(" M essag e:%s\n",me sg);pr intf("EIO:\n");char*mesg1 = s trerr or(EI O); pri ntf(" Err no :%d\n",EIO);print f(" Messa ge:%s\n",m esg1);print f("EE XIST:\n");char*mesg2 = s trerr or(EE XIST);print f(" Errno :%d\n",E EXIST); prin tf(" Mess age:%s\n",mesg2);}编译运行结果如下:ENOEN T:Errno :2Mes sage:No su ch fi le or dire ctoryEIO:Messa ge:In put/o utput erro rEEX IST :E rrno :17Mes sage:Fileexist s下面用序号显示错误信息c har *strer rno(i nt er ronum)输入以下源程序:#inc lude#inc lude#inc ludeintmain(void){ int i; fo r(i=0;i编译运行如下:errn o :0messa ge :S ucces serr no :1mess age :Opera tionnot p ermit tede rrno:2me ssage :Nosuchfileor di recto ryer rno :3mes sage:No s uch p roces serr no :4mess age :Inter rupte d sys tem c alle rrno:5me ssage :Inp ut/ou tputerrorerrn o :6messa ge :N o suc h dev ice o r add resserrno :7m essag e :Ar gumen t lis t too longerrn o :8messa ge :E xec f ormat erro rerr no :9mess age :Bad f ile d escri ptorerrno :10messa ge :N o chi ld pr ocess eser rno :11me ssage :Res ource temp orari ly un avail ableerrno :12messa ge :C annot allo catememor yerr no :13mes sage:Perm issio n den iede rrno:14m essag e :Ba d add ressmessa ge :B lockdevic e req uired# _i386_e rrno_h标识#定义_i386_er rno_h#定义e perm 1 / * * /操作不允许#定义en oent2 / * * /没有这样的文件或目录#定义es rch 3 / ** /没有这样的过程#定义e intr 4 / * * /中断系统调用#定义操作错误5 / ** / /错误#定义enxi o 6 / *没有这样的设备或地址* / #定义e2big7 / * * /参数表太长#定义en oexec8 /* * /执行格式错误#定义ebadf9 /* * /错误的文件编号#定义echi ld 10 / ** /无子过程#定义eaga in 11 / ** /再试一次#定义enom em 12 / ** /内存不足#定义eacc es 13 / ** /拒绝许可#定义efau lt 14 / ** /坏地址#定义enotb lk 15 / ** /块设备请求#定义设备的16 / * */设备或资源忙#定义eexi st 17 / ** /文件存在#定义exde v 18/ * * /交叉链接#定义enode v 19/ * * /没有这种装置#定义eno tdir20 /* * /不是一个目录#定义eisdi r 21/ * * /目录#定义ei nval22 /* * /参数无效#定义en file23 /* * /文件表溢出#定义e mfile24 / * */打开文件太多#定义enot ty 25 / ** /没有打字机#定义etx tbsy26 /* * /文本文件忙#定义e fbig27 /* * /文件太大#定义en ospc28 /* * /设备上没有空间了#定义esp ipe 29 / *非法谋取* /#定义erof s 30/ * * /只读文件系统#定义eml ink 31 / * * /太多的链接#定义ep ipe 32 / * * /断管#定义以东33 / *数学论证的域名功能*/ #定义erang e 34/ * * /不可表示的数学结果#定义edead lk 35 / ** /会发生资源死锁#ena metoo long36 /* * /文件名太长#定义e nolck37 / *没有记录锁可*/#定义enosy s 38/ * * /功能没有实现#定义eno tempt y 39/ * * /目录不空#定义eloop40 / * */遇到太多的符号链接#定义e would block eaga in /* * /操作将阻塞#定义e nomsg42 / * */没有期望类型的消息#定义e idrm43 /* * /标识符删除#定义e chrng44 / * */频道数目超出范围#定义el2nsyn c 45/ * * /2级不同步#定义el3h lt 46 / ** /3级中断#定义el3r st 47 / ** /3级复位#定义elnr ng 48 / ** /链接数超出范围#定义e unatc h 49/ * * /不附协议驱动#定义eno csi 50 / * * /没有倡议结构可用#定义el2h lt 51 / ** /2级中断#定义ebad e 52/ * * /无效的交换#定义ebad r 53/ * * /无效请求描述符#定义ex full54 /* * /交流全#定义eno ano 55 / * * /阳极#定义ebadr qc 56 / ** /无效的请求代码#定义e badsl t 57/ * * /无效槽# ed eadlo ck ed eadlk定义#定义ebfo nt 59 / ** /错误的字体文件格式#定义enos tr 60 / ** /不流装置#定义enod ata 61 / * * /无可用数据#定义和62 / * */计时器过期#定义enosr63 / * */资源的溪流#定义enone t 64/ *机上的不是网* /#定义enop kg 65 / ** /没有安装软件包#定义e remot e 66/ * * /对象是远程的#定义eno link67 /* * /联系被切断#定义马腺病毒68 / * * /宣传错误#定义esr mnt 69 / * * /srmou nt误差#定义在70 / * */通讯错误发送#定义epro to 71 / ** /协议错误#定义emul tihop72 / * */跳企图#定义ed otdot 73 / * */具体错误率#定义ebadm sg 74 / ** /没有数据信息#定义eo verfl ow 75 / *值太大,定义数据类型* / #定义enot uniq76 /* * /网络名称不唯一#定义ebad fd 77 / ** /文件描述符在坏状态#定义erem chg 78 / * * /远程地址改变了#定义eliba cc 79 / *无法访问必要的共享库* /#定义elib bad 80 / * * /访问损坏的共享库#定义elib scn 81 / * . ou t。
linux常见故障排错思路
Linux常见故障排错思路Linux操作系统因其开源、稳定、安全等特点,在服务器领域得到广泛应用。
但在使用过程中,无论是初学者还是经验丰富的系统管理员,都可能会遇到各种问题。
本文将详细阐述Linux系统中常见的故障及其排错思路,旨在帮助读者快速定位并解决问题。
一、启动故障1. GRUB引导加载器问题- 故障现象:系统启动时,无法加载GRUB或出现GRUB错误提示。
- 排错思路:- 检查GRUB配置文件是否正确。
- 使用Live CD/USB启动,进入救援模式修复GRUB。
- 重新安装GRUB到MBR。
2. 内核问题- 故障现象:启动过程中内核崩溃或无法继续启动。
- 排错思路:- 查看启动日志,分析内核报错信息。
- 尝试更换不同版本的内核启动。
- 检查硬件兼容性,如内存、CPU等。
3. 文件系统损坏- 故障现象:系统提示文件系统损坏,无法正常挂载。
- 排错思路:- 使用fsck工具检查和修复文件系统。
- 分析dmesg输出,查找与文件系统相关的错误。
- 在必要时恢复备份数据。
二、网络故障1. 无法连接到网络- 故障现象:系统无法访问外部网络或局域网。
- 排错思路:- 检查网络接口是否启动。
- 使用ping命令测试网络连通性。
- 查看/etc/resolv.conf文件中的DNS设置。
- 检查防火墙和网络策略配置。
2. SSH连接问题- 故障现象:无法通过SSH远程连接到服务器。
- 排错思路:- 检查SSH服务是否运行。
- 查看SSH配置文件(如/etc/ssh/sshd_config)是否正确。
- 使用netstat或ss命令检查SSH端口监听状态。
- 查看系统日志(如/var/log/auth.log)中的SSH相关记录。
三、性能问题1. 系统负载过高- 故障现象:系统响应缓慢,CPU、内存或磁盘负载过高。
- 排错思路:- 使用top、htop或vmstat命令监控系统资源使用情况。
- 分析系统日志,查找可能导致高负载的原因。
Linux服务器前台常出现的错误提示及含意
Linux服务器前台常出现的错误提示及含意2008-07-22 20:44◆一般类的提示eth1: Too much work at interrupt, IntrStatus=0x0001这条提示的含意为. 某网卡的中断请求过多. 如果只是偶尔出现一次可忽略. 但这条提示如果经常出现或是集中出现,那涉及到的可能性就比较多有可能需要进行处理了.。
可能性比较多,如网卡性能;服务器性能;网络攻击..等等。
◆一般类的提示IPVS: incoming ICMP: failed checksum from 61.172.0.X!服务器收到了一个校验和错误的ICMP数据包。
这类的数据包有可能是非法产生的垃圾数据.但从目前来看服务器收到这样的数据非常多,一般都忽略。
一般代理服务器在工作时会每秒钟转发几千个数据包.收到几个错误数据包不会影响正常的工作.这是问我最多的一类提示了。
◆一般类的提示NET: N messages suppressed.服务器忽略了N 个数据包.和上一条提示类似。
服务器收到的数据包被认为是无用的垃圾数据数据。
这类数据多是由攻击类的程序产生的。
这条提示如果N 比较小的时候可以忽略。
但如果经常或是长时间出现3位数据以上的这类提示,就很有可能是服务器受到了垃圾数据类的带宽攻击了。
◆一般类的提示UDP: bad checksum. From 221.200.X.X:50279 to 218.62.X.X:1155 ulen 24UDP: short packet: 218.2.X.X:3072 3640/217 to 222.168.X.X:57596218.26.131.X sent an invalid ICMP type 3, code 13 error to a broadcast: 0.1.0.4 on eth0服务器收到了一个错误的数据包,分别为UDP校验和错误;过短的UDP数据包;一个错误的ICMP类型数据。
Linux错误码大全(建议收藏)
Linux错误码大全查看错误代码errno是调试程序的一个重要方法。
当linuc C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。
在实际编程中用这一招解决了不少原本看来莫名其妙的问题。
比较麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。
1-34号错误号是在内核源码的include/asm-generic/errno-base.h定义35-132则是在include/asm-generic/errno.h中定义剩下还有一些更大的错误号是留给内核级别的,如系统调用等,用户程序一般是看不见的这些号的,Ubuntu9.10中/usr/src/linux-headers-2.6.31-21-generic/include/linux/errno.h#ifndef _ASM_GENERIC_ERRNO_BASE_H#define _ASM_GENERIC_ERRNO_BASE_H#define EPERM 1 /*Operation not permitted */ #define ENOENT 2 /*No such file or directory */ #define ESRCH 3 /*No such process */#define EINTR 4 /*Interrupted system call */ #define EIO 5 /*I/O error */#define ENXIO 6 /*No such device or address */ #define E2BIG 7 /*Argument list too long */ #define ENOEXEC 8 /*Exec format error */ #define EBADF 9 /*Bad file number */#define ECHILD 10 /*No child processes */ #define EAGAIN 11 /*Try again */#define ENOMEM 12 /*Out of memory */#define EACCES 13 /*Permission denied */ #define EFAULT 14 /*Bad address */#define ENOTBLK 15 /*Block device required */ #define EBUSY16 /*Device or resource busy */ #define EEXIST 17 /*File exists */#define EXDEV 18 /*Cross-device link */#define ENODEV 19 /*No such device */#define ENOTDIR 20 /*Not a directory */#define EISDIR 21 /*Is a directory */#define EINVAL 22 /*Invalid argument */#define ENFILE 23 /*File table overflow */#define EMFILE 24 /*Too many open files */#define ENOTTY 25 /*Not a typewriter */#define ETXTBSY 26 /*Text file busy */#define EFBIG 27 /*File too large */#define ENOSPC 28 /*No space left on device */ #define ESPIPE 29 /*Illegal seek */#define EROFS 30 /*Read-only file system */#define EMLINK 31 /*Too many links */#define EPIPE 32 /*Broken pipe */#define EDOM 33 /*Math argument out of domain of func */#define ERANGE 34 /*Math result not representable */#endif#include#define EDEADLK 35 /*Resource deadlock would occur */ #define ENAMETOOLONG 36 /*File name too long */#define ENOLCK 37 /*No record locks available */ #define ENOSYS 38 /*Function not implemented */ #defineENOTEMPTY 39 /*Directory not empty */#define ELOOP 40 /*Too many symbolic links encountered */#define EWOULDBLOCK EAGAIN /*Operation would block */ #define ENOMSG 42 /*No message of desired type */ #define EIDRM 43 /*Identifier removed */#define ECHRNG 44 /*Channel number out of range */ #define EL2NSYNC 45 /*Level 2 not synchronized */ #define EL3HLT 46 /*Level 3 halted */#define EL3RST 47 /*Level 3 reset */#define ELNRNG 48 /*Link number out of range */#define EUNATCH 49 /*Protocol driver not attached */ #define ENOCSI 50 /*No CSI structure available */ #define EL2HLT 51 /*Level 2 halted */#define EBADE 52 /*Invalid exchange */#define EBADR 53 /*Invalid request descriptor */ #define EXFULL 54 /*Exchange full */#define ENOANO 55 /*No anode */#define EBADRQC 56 /*Invalid request code */ #define EBADSLT 57 /*Invalid slot */#define EDEADLOCK EDEADLK#define EBFONT 59 /*Bad font file format */#define ENOSTR 60 /*Device not a stream */#define ENODATA 61 /*No data available */#define ETIME 62 /*Timer expired */#define ENOSR 63 /*Out of streams resources */#define ENONET 64 /*Machine is not on the network */ #define ENOPKG 65 /*Package not installed */ #define EREMOTE 66 /*Object is remote */#define ENOLINK 67 /*Link has been severed */ #define EADV 68 /*Advertise error */#define ESRMNT 69 /*Srmount error */#define ECOMM 70 /*Communication error on send */ #define EPROTO 71 /*Protocol error */#define EMULTIHOP 72 /*Multihop attempted */#define EDOTDOT 73 /*RFS specific error */#define EBADMSG 74 /*Not a data message */#define EOVERFLOW 75 /*Value too large for defined data type */#define ENOTUNIQ 76 /*Name not unique on network */#define EBADFD 77 /*File descriptor in bad state */ #define EREMCHG 78 /*Remote address changed */ #define ELIBACC 79 /*Can not access a needed shared library */#define ELIBBAD 80 /*Accessing a corrupted shared library */ #define ELIBSCN 81 /* .lib section in a.out corrupted */#define ELIBMAX 82 /*Attempting to link in too many shared libraries */#define ELIBEXEC 83 /*Cannot exec a shared library directly */ #define EILSEQ 84 /*Illegal byte sequence */#define ERESTART 85 /*Interrupted system call should be restarted */#define ESTRPIPE 86 /*Streams pipe error */#define EUSERS 87 /*Too many users */#define ENOTSOCK 88 /*Socket operation on non-socket */#define EDESTADDRREQ 89 /*Destination address required */ #define EMSGSIZE 90 /*Message too long */#define EPROTOTYPE 91 /*Protocol wrong type for socket */ #define ENOPROTOOPT 92 /*Protocol not available */#define EPROTONOSUPPORT 93 /*Protocol not supported */ #define ESOCKTNOSUPPORT 94 /*Socket type not supported */ #define EOPNOTSUPP 95 /*Operation not supported on transport endpoint */#define EPFNOSUPPORT 96 /*Protocol family not supported */ #define EAFNOSUPPORT 97 /*Address family not supported by protocol */#define EADDRINUSE 98 /*Address already in use */#define EADDRNOTAVAIL 99 /*Cannot assign requested address */#define ENETDOWN 100 /*Network is down */#define ENETUNREACH 101 /*Network is unreachable */#define ENETRESET 102 /*Network dropped connection because of reset */#define ECONNABORTED 103 /*Software caused connection abort */#define ECONNRESET 104 /*Connection reset by peer */#define ENOBUFS 105 /*No buffer space available */ #define EISCONN 106 /*Transport endpoint is already connected */#define ENOTCONN 107 /*Transport endpoint is not connected */#define ESHUTDOWN 108 /*Cannot send after transport endpoint shutdown */#define ETOOMANYREFS 109 /*T oo many references: cannot splice */#define ETIMEDOUT 110 /*Connection timed out */#define ECONNREFUSED 111 /*Connection refused */ #define EHOSTDOWN 112 /*Host is down */#define EHOSTUNREACH 113 /*No route to host */#define EALREADY 114 /*Operation already in progress */ #define EINPROGRESS 115 /*Operation now in progress */ #define ESTALE 116 /*Stale NFS file handle */ #define EUCLEAN 117 /*Structure needs cleaning */ #define ENOTNAM 118 /*Not a XENIX named type file */ #define ENAVAIL 119 /*No XENIX semaphores available */ #define EISNAM 120 /*Is a named type file */ #define EREMOTEIO 121 /*Remote I/O error */#define EDQUOT 122 /*Quota exceeded */#define ENOMEDIUM 123 /*No medium found */#define EMEDIUMTYPE 124 /*Wrong medium type *#define ECANCELED 125 / *操作已取消*/#define ENOKEY 126 / *必需的密钥不可用*/ #define EKEYEXPIRED 127 / *密钥已过期*/#define EKEYREVOKED 128 / *密钥已被撤销*/#define EKEYREJECTED 129 / *密钥被服务拒绝*// *用于强大的互斥体*/#define EOWNERDEAD 130 / *所有者死亡*/#define ENOTRECOVERABLE 131 / *状态不可恢复*/#define ERFKILL 132 / *由于射频杀死*/#ifdef __KERNEL__/ **用户程序切勿看到这些内容。
关于Segmentationfault(coredumped)
关于Segmentationfault(coredumped)有的程序可以通过编译,但在运⾏时会出现Segment fault(段错误)。
这通常都是指针错误引起的。
但这不像编译错误⼀样会提⽰到⽂件⼀⾏,⽽是没有任何信息。
⼀种办法是⽤gdb的step, ⼀步⼀步寻找。
但要step⼀个上万⾏的代码让⼈难以想象。
我们还有更好的办法,这就是core file。
如果想让系统在信号中断造成的错误时产⽣core⽂件, 我们需要在shell中按如下设置:#设置core⼤⼩为⽆限 ulimit -c unlimited#设置⽂件⼤⼩为⽆限 ulimit unlimited发⽣core dump之后,⽤gdb进⾏查看core⽂件的内容, 以定位⽂件中引发core dump的⾏:gdb [exec file] [core file]如: gdb ./test test.core 在进⼊gdb后,⽤bt命令查看backtrace以检查发⽣程序运⾏到哪⾥,来定位core dump的⽂件->⾏。
另外需要注意的是,如果你的机器上跑很多的应⽤,你⽣成的core⼜不知道是哪个应⽤产⽣的,你可以通过下列命令进⾏查看:file core⼏个问题:1. 什么是Core:在使⽤半导体作为内存的材料前,⼈类是利⽤线圈当作内存的材料(发明者为王安),线圈就叫作 core ,⽤线圈做的内存就叫作 core memory。
如今,半导体⼯业澎勃发展,已经没有⼈⽤core memory 了,不过,在许多情况下,⼈们还是把记忆体叫作 core 。
2. 什么是Core Dump:我们在开发(或使⽤)⼀个程序时,最怕的就是程序莫明其妙地当掉。
虽然系统没事,但我们下次仍可能遇到相同的问题。
于是这时操作系统就会把程序当掉时的内存内容 dump 出来(现在通常是写在⼀个叫 core 的 file ⾥⾯),让我们或是 debugger 做为参考。
这个动作就叫作 core dump。
在Linux上什么是段错误?如何获得一个核心转储-
在Linux上什么是段错误?如何获得一个核心转储?本周工作中,我花了整整一周的时间来尝试调试一个段错误。
我以前从来没有这样做过,我花了很长时间才弄清楚其中涉及的一些基本事情(获得核心转储、找到导致段错误的行号)。
于是便有了这篇博客来解释如何做那些事情!在看完这篇博客后,你应该知道如何从“哦,我的程序出现段错误,但我不知道正在发生什么”到“我知道它出现段错误时的堆栈、行号了!”。
什么是段错误?“段错误segmentation fault”是指你的程序尝试访问不允许访问的内存地址的情况。
这可能是由于:试图解引用空指针(你不被允许访问内存地址 0);试图解引用其他一些不在你内存(LCTT 译注:指不在合法的内存地址区间内)中的指针;一个已被破坏并且指向错误的地方的C++++ 虚表指针C++ vtable pointer,这导致程序尝试执行没有执行权限的内存中的指令;其他一些我不明白的事情,比如我认为访问未对齐的内存地址也可能会导致段错误(LCTT 译注:在要求自然边界对齐的体系结构,如MIPS、ARM 中更容易因非对齐访问产生段错误)。
这个“C++ 虚表指针”是我的程序发生段错误的情况。
我可能会在未来的博客中解释这个,因为我最初并不知道任何关于C++ 的知识,并且这种虚表查找导致程序段错误的情况也是我所不了解的。
但是!这篇博客后不是关于C++ 问题的。
让我们谈论的基本的东西,比如,我们如何得到一个核心转储?运行valgrind我发现找出为什么我的程序出现段错误的最简单的方式是使用 valgrind:我运行valgrind -vyour-program这给了我一个故障时的堆栈调用序列。
简洁!。
Linux下的段错误(Segmentationfault)产生的原因及调试方法(经典)
简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。
一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了.在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的1)访问系统数据区,尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域解决方法我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。
实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。
但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定位这些"段错误"的语句。
下面将就以下的一个存在段错误的程序介绍几种调试方法:1 dummy_function (void)2 {3 unsigned char *ptr = 0x00;4 *ptr = 0x00;5 }67 int main (void)8 {9 dummy_function ();1011 return 0;12 } 作为一个熟练的C/C++程序员,以上代码的bug应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。
LINUX日志的错误等级
LINUX⽇志的错误等级
系统将讯息分为七个主要的等级,依序是由不重要排列到重要讯息等级:
info:仅是⼀些基本的讯息说明⽽已;
notice:⽐ info 还需要被注意到的⼀些信息内容;
warning 或 warn:警⽰讯息,可能有问题,但是还不⾄于影响到某个 daemon 运作。
err 或 error :⼀些重⼤的错误讯息,这就要去找原因了。
crit:⽐ error 还要严重的错误信息,crit 是临界点 (critical) 的缩写,已经很严重了!
alert:警告警告,已经很有问题的等级,⽐ crit 还要严重!
emerg 或 panic:疼痛等级,意指系统已经⼏乎要当机的状态!很严重的错误信息了。
除了这些有等级的讯息外,还有两个特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级) 两个,当要作⼀些错误侦测,或者是忽略掉某些服务的信息时,就⽤这俩!
在讯息等级之前还有 [.=!] 的连结符号!他代表的意思是:
. :代表⽐后⾯还要⾼的等级(含该等级)都被记录下来的意思,例如: 代表只要是 mail 的信息,⽽且该信息等级⾼于 info (含info )时,就会被记录下来。
.=:代表所需要的等级就是后⾯接的等级⽽已!
.!:代表不等于。
Segmentationfault(coredumped)
彩虹世界的专栏为中华民族软件产业之崛起而埋首敲代码。
在这里,为中华民族的崛起贡献自己的全部力量·······S egmentation fault (core dumped)分类: c linux 2013-07-14 20:56 6人阅读 评论(0) 收藏举报Segmentation fault c转自:/uid-26748613-id-3182113.html参考:/manpages/lucid/man5/core.5.html有的程序可以通过编译,但在运行时会出现Segment fault(段错误)。
这通常都是指针错误引起的。
但这不像编译错误一样会提示到文件一行,而是没有任何信息。
一种办法是用gdb的step, 一步一步寻找。
但要step一个上万行的代码让人难以想象。
我们还有更好的办法,这就是core file。
如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置:#设置core大小为无限 ulimit -c unlimited#设置文件大小为无限 ulimit unlimited发生core dump之后,用gdb进行查看core文件的内容, 以定位文件中引发core dump的行:gdb [exec file] [core file]如: gdb ./test test.core 在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里,来定位core dump的文件->行。
另外需要注意的是,如果你的机器上跑很多的应用,你生成的core又不知道是哪个应用产生的,你可以通过下列命令进行查看:file core几个问题:1. 什么是Core:在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明者为王安),线圈就叫作 core ,用线圈做的内存就叫作 core memory。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 执行socket文件时,出现段错误 (core dumped产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.解决方法:利用gdb逐步查找段错误:首先我们需要一个带有调试信息的可执行程序,所以我们加上“-g -rdynamic"的参数进行编译,然后用gdb调试运行这个新编译的程序,具体步骤如下:1、 gcc -g -rdynamic d.c2、 gdb ./a.out3、 r这样就找到了出错位置。
然后在相应位置修改。
2 linux 段错误如何调试linux下的c程序常常会因为内存访问错误等原因造成segment fault(段错误)此时如果系统core dump功能是打开的,那么将会有内存映像转储到硬盘上来,之后可以用gdb对core文件进行分析,还原系统发生段错误时刻的堆栈情况。
这对于我们发现程序bug很有帮助。
使用ulimit -a可以查看系统core文件的大小限制;使用ulimit -c [kbytes]可以设置系统允许生成的core文件大小。
ulimit -c 0 不产生core文件ulimit -c 100 设置core文件最大为100kulimit -c unlimited 不限制core文件大小步骤:1、当发生段错误时,我们查看ulimit -a (core file size (blocks, -c 0)并没有文件,2、设置:ulimit -c unlimited 不限制core文件大小3.、运行程序,发生段错误时会自动记录在core中4、test]$ ls -al core.* 在那个文件下(-rw------- 1 leconte leconte 139264 01-06 22:3 1 core.2065)5、使用gdb 运行程序和段错误记录的文件。
(est]$ gdb ./test core.2065)6、会提哪行有错。
很多系统默认的core文件大小都是0,我们可以通过在Shell的启动脚本/etc/bashrc或者~/.bashrc等地方来加入ulimit -c 命令来指定core文件大小,从而确保core文件能够生成。
除此之外,还可以在/proc/sys/kernel/core_pattern里设置core文件的文件名模板,详情请看core的官方man手册。
3 段错误bug的调试我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。
实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。
但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定位这些"段错误"的语句。
下面将就以下的一个存在段错误的程序介绍几种调试方法:1 dummy_function (void2 {3 unsigned char *ptr = 0x00;4 *ptr = 0x00;5 }67 int main (void8 {9 dummy_function (;1011 return 0;12 }作为一个熟练的C/C++程序员,以上代码的bug应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。
我们尝试编译运行它:xiaosuo@gentux test $ ./a.out段错误果然不出所料,它出错并退出了。
1.利用gdb逐步查找段错误:这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程序,所以我们加上“-g -rdynamic"的参数进行编译,然后用gdb调试运行这个新编译的程序,具体步骤如下:xiaosuo@gentux test $ gcc -g -rdynamic d.cxiaosuo@gentux test $ gdb ./a.outGNU gdb 6.5Copyright (C 2006 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i686-pc-linux-gnu"ing host libthread_db library"/lib/libthread_db.so.1".(gdb rStarting program: /home/xiaosuo/test/a.outProgram received signal SIGSEGV, Segmentation fault.0x08048524 in dummy_function ( at d.c:44 *ptr = 0x00;(gdb哦?!好像不用一步步调试我们就找到了出错位置d.c文件的第4行,其实就是如此的简单。
从这里我们还发现进程是由于收到了SIGSEGV信号而结束的。
通过进一步的查阅文档(man 7 signal,我们知道SIGSEGV默认handler的动作是打印”段错误"的出错信息,并产生Core文件,由此我们又产生了方法二。
2.分析Core文件:Core文件是什么呢?The default action of certain signals is to cause a process to terminate and produce a core dump file, a disk file containing an image of the process's memory at the time of termination. A list of the signals which cause a process to dump core can be found in signal(7.以上资料摘自man page(man 5 core。
不过奇怪了,我的系统上并没有找到core文件。
后来,忆起为了渐少系统上的拉圾文件的数量(本人有些洁癖,这也是我喜欢Gentoo的原因之一),禁止了core文件的生成,查看了以下果真如此,将系统的core文件的大小限制在512K大小,再试:xiaosuo@gentux test $ ulimit -cxiaosuo@gentux test $ ulimit -c 1000xiaosuo@gentux test $ ulimit -c1000xiaosuo@gentux test $ ./a.out段错误 (core dumpedxiaosuo@gentux test $ lsa.out core d.c f.c g.c pango.c test_iconv.c test_regex.ccore文件终于产生了,用gdb调试一下看看吧:xiaosuo@gentux test $ gdb ./a.out coreGNU gdb 6.5Copyright (C 2006 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i686-pc-linux-gnu"ing host libthread_db library "/lib/libthread_db.so.1".warning: Can't read pathname for load map: 输入/输出错误.Reading symbols from /lib/libc.so.6...done.Loaded symbols for /lib/libc.so.6Reading symbols from /lib/ld-linux.so.2...done.Loaded symbols for /lib/ld-linux.so.2Core was generated by `./a.out'.Program terminated with signal 11, Segmentation fault.#0 0x08048524 in dummy_function ( at d.c:44 *ptr = 0x00;接着考虑下去,以前用windows系统下的ie的时侯,有时打开某些网页,会出现“运行时错误”,这个时侯如果恰好你的机器上又装有windows的编译器的话,他会弹出来一个对话框,问你是否进行调试,如果你选择是,编译器将被打开,并进入调试状态,开始调试。
Linux下如何做到这些呢?我的大脑飞速地旋转着,有了,让它在SIGSEGV的handler中调用gdb,于是第三个方法又诞生了:3.段错误时启动调试:#include#include#include#includevoid dump(int signo{char buf[1024];char cmd[1024];snprintf(buf, sizeof(buf, "/proc/%d/cmdline", getpid(; if(!(fh = fopen(buf, "r"exit(0;if(!fgets(buf, sizeof(buf, fhexit(0;fclose(fh;if(buf[strlen(buf - 1] == '\n'buf[strlen(buf - 1] = '\0';snprintf(cmd, sizeof(cmd, "gdb %s %d", buf, getpid(; system(cmd;exit(0;}voiddummy_function (void{unsigned char *ptr = 0x00;*ptr = 0x00;}int{signal(SIGSEGV, &dump;dummy_function (;return 0;}编译运行效果如下:xiaosuo@gentux test $ gcc -g -rdynamic f.cxiaosuo@gentux test $ ./a.outGNU gdb 6.5Copyright (C 2006 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i686-pc-linux-gnu"ing host libthread_db library "/lib/libthread_db.so.1".Attaching to program: /home/xiaosuo/test/a.out, process 9563Reading symbols from /lib/libc.so.6...done.Loaded symbols for /lib/libc.so.6Reading symbols from /lib/ld-linux.so.2...done.Loaded symbols for /lib/ld-linux.so.20xffffe410 in __kernel_vsyscall ((gdb bt#0 0xffffe410 in __kernel_vsyscall (#1 0xb7ee4b53 in waitpid ( from /lib/libc.so.6#2 0xb7e925c9 in strtold_l ( from /lib/libc.so.6#3 0x08048830 in dump (signo=11 at f.c:22#4#5 0x0804884c in dummy_function ( at f.c:31#6 0x08048886 in main ( at f.c:38以上方法都是在系统上有gdb的前提下进行的,如果没有呢?其实glibc为我们提供了此类能够dump栈内容的函数簇,详见/usr/include/execinfo.h(这些函数都没有提供man page,难怪我们找不到),另外你也可以通过gnu的手册进行学习。