Linux中生成 Core Dump 文件的方法

1 什么是 Core Dump

Core Dump 又叫核心转储。在程序运行过程中发生异常时,将其内存数据保存到文件中,这个过程叫做 Core Dump。

2 Core Dump 的作用

在开发过程中,难免会遇到程序运行过程中异常退出的情况,这时候想要定位哪里出了问题,仅仅依靠程序自身的信息打印(日志记录)往往是不够的,这个时候就需要 Core Dump 文件来帮忙了。

一个完整的 Core Dump 文件实际上相当于恢复了异常现场,利用 Core Dump 文件,可以查看到程序异常时的所有信息,变量值、栈信息、内存数据,程序异常时的运行位置(甚至记录代码行号)等等,定位所需要的一切信息都可以从 Core Dump文件获取到,能够非常有效的提高定位效率。

3 如何生成 Core Dump

3 …


Linux信号处理机制

在Linux中,信号是进程间通讯的一种方式,它采用的是异步机制。当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。

需要说明的是,信号只是用于通知进程发生了某个事件,除了信号本身的信息之外,并不具备传递用户数据的功能。

1 信号的响应动作

每个信号都有自己的响应动作,当接收到信号时,进程会根据信号的响应动作执行相应的操作,信号的响应动作有以下几种:

  • 中止进程(Term)
  • 忽略信号(Ign)
  • 中止进程并保存内存信息(Core)
  • 停止进程(Stop)
  • 继续运行进程(Cont)

用户可以通过signalsigaction函数修改信号的响应动作(也就是常说的“注册信号”,在文章的后面会举例说明)。另外,在多线程中,各线程的信号响应动作都是相同的,不能对某个线程设置独立的响应动作。

2 信号类型

Linux支持的信号类型可以参考下面给出的列表。

2.1 在POSIX.1-1990标准中的信号列表

信号 动作 说明 …

函数调用栈的获取原理分析

上一篇文章《在Linux程序中输出函数调用栈》,讲述了在Linux中如何利用backtrace获取调用栈,本篇文章主要介绍一下获取函数调用栈的原理,并给出相应的实现方式。

要了解调用栈,首先需要了解函数的调用过程,下面用一段代码作为例子:

#include <stdio.h>

int add(int a, int b) {
    int result = 0;

    result = a + b;

    return result;
}

int main(int argc, char *argv[]) {
    int result = 0;

    result = add(1, 2);

    printf("result = %d \r\n", result);

    return 0;
}

使用gcc编译,然后gdb反汇编main函数,看看它是如何调用add函数的:

(gdb …

在Linux程序中输出函数调用栈

程序发生异常时,将函数的调用栈打印出来,可以大大提高定位效率。

Linux中提供了三个函数用来获取调用栈:

/* 获取函数调用栈 */
int backtrace(void **buffer, int size);

/* 将调用栈中的函数地址转化为函数名称 并返回一个字符串数组 */
char **backtrace_symbols(void *const *buffer, int size);

/* 将调用栈中的函数地址转化为函数名称 并将其定入到文件中 */
void backtrace_symbols_fd(void *const *buffer, int size, int fd);

示例代码:

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>

/* 打印调用栈的最大深度 */
#define DUMP_STACK_DEPTH_MAX 16

/* 打印调用栈函数 */
void dump_trace() {
    void *stack_trace …

博客搬家完成,新域名正式上线

昨天注册了hutaow.net这个域名,决心把博客搬过来,恢复写博客的生活。

算下来差不多有两年时间都没有更新过了,其中一个最主要借口是找不到合适的落脚点,时间最长地方要数ChinaUNIX了,早期的时候用着还是蛮不错的,但是随着时间的推移,ChinaUNIX的系统更新实在是跟不上节奏,想到过搬家但是由于ChinaUNIX的订阅数据实在太蹩脚,连搬都不好搬,更不用说评论等等了,博客搬家的计划也就一直搁置了。后来有试过CSDN无奈上面的广告太多,百度也试过但是它贴代码的效果实在太差,WordPress又悲催的被墙等等。

另一个借口就是工作太忙没时间,一回家就不太想写东西了,但是最近开始意识到挥挥衣袖什么都没有留下的感觉很不好,没有积累,没有思考,需要改变一下了。

博客一方面作为记录,把了解的知识积累下来,方便自己以后回忆;另一方面作为分享,将解决问题过程中吸取的经验写下来,供大家参考,这样遇到同样问题时可以更迅速的解决。

不多说,坚持就好。


TP-WR703n安装OpenWRT记录

1 安装OpenWRT

1.1 下载并刷新固件

如果以前没刷过OpenWRT,需要升级factory固件,点击这里下载

如果之前已经安装过了OpenWRT,则直接更新sysupgrade固件即可,点击这里下载

注意升级的时候要将原配置删除,避免配置文件互相影响,固件刷新完成后,路由器会自动重启。

1.2 登陆路由器

OpenWRT主线固件的无线信号是默认关闭的,这个时候需要找跟网线将电脑和路由器连接上,然后将电脑的IP地址设置为静态的"192.168.1.100",然后用Telnet访问"192.168.1.1",正确的情况下,会看到如下界面: First Login

1.3 打开无线信号

编辑"/etc/config/wireless"文件,将"option disabled 1"这一行注掉,或者直接删除。

config wifi-device radio0
    option …



配置 Cisco Catalyst 3560 交换机端口镜像

假设要将19和27号端口的数据镜像到2号端口,按如下操作进行:

1) 通过串口登陆到交换机,其中参数设置为:速率9600bps,8位数据位,1位停止位,无奇偶校验,无流量控制。

2) 交换机上电自检然后登入后出现命令提示符:

Switch>

3) 依次进入特权模式和全局模式,输入如下命令:

Switch>enable
Password:
Switch#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#

4) 在新session中,将端口19和27设置为被监听端口(source),2号端口设置为监听端口(destination),命令如下:

Switch(config)#monitor session 1 source interface Fa0/19 …

C#获取XML文件指定节点的数据

实例说明会更清楚些,假设有如下XML文件:

``` xml message_hutaow.xml <?xml version="1.0" encoding="UTF-8"?>        20080502            

192.168.0.1
      hutaow                 
192.168.0.19
    
  

现在要读取消息源IP地址(192.168.0.1)和目的IP地址(192.168.0.19)

<!-- more -->

根据上面XML文件的结构,查找路径为"/Message/Head/Source/Address""/Message/Head/Target/Address",需要用到 …