zoukankan      html  css  js  c++  java
  • 调试与分析

    一、获取内核转储

    大多数Linux发行版默认关闭内核转储功能,可使用 ulimit -c 查看,-c 表示内核转储文件的大小限制,如果为0,表示未开启。

    1、可设置为 ulimit -c unlimited 表示无限制,或设置为其它数值,单位是字节,立即生效。

    2、修改 /etc/security/limits.conf 文件,重启后生效。

    开启该功能后,当程序异常终止时,会在当前目录下生成 core.pid  的内核转储文件。通过  gdb -c core.pid  ./a.out  就可以启动调试。

    修改 coredump 的路径和格式:

    1、修改配置文件/etc/sysctl.conf (重启后生效,也可以使用 sysctl -p 命令使其立即生效),如:

    kernel.core_pattern = core
    kernel.core_uses_pid = 0  #是否给 core 文件增加 pid 值的后缀名,为 1 表示增加,为 0 表示不增加

    2、使用命令直接改写内存(可立即生效,但重启后失效),如:

    echo "core" > /proc/sys/kernel/core_pattern
    echo "0" > /proc/sys/kernel/core_uses_pid

    注:core_pattern 可以设置为  /var/core/%e_%t.core ,从而定制了 core 文件的统一路径和命令规则(%e:执行文件名称;%t:产生 core 文件时间戳)

    二、gdb 附加到正在运行的进程

    attach pid ,调试完之后,使用 detach 即可以和进程分离。

    加上 -g 选项编译生成的可执行文件(如 a.out),运行后在挂掉时,会向 /var/log/message 文件中写入地址信息(即 IP 指向的值,如 40052e ),通过 addr2line -e a.out 40052e 就可以输出错误发生在哪个文件的哪一行中。注:如果没有向 /var/log/message 写入信息,请查看 syslog 服务有没有启动,CentOS6.4 下,需要 /etc/init.d/rsyslog restart

    gcc -pg test.cpp -o test  //编译和链接时都需要加上 -pg 参数

    ./test  //生成 gmon.out 文件

    wget http://gprof2dot.jrfonseca.googlecode.com/git/gprof2dot.py      

    wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.34.0.tar.gz  

    gprof ./test gmon.out >report.txt  //生成报告文件

    gprof2dot report.txt > test.dot    //生成 dot 文件

    dot test.dot -Tpng -o test.png    //将 dot 文件生成图片

  • 相关阅读:
    Asp.net2.0页面执行顺序
    [转帖]常用的SQL语句
    [转帖]黑客技术经典问题FAQ
    面试的一些心得
    较全的正则表达式
    很好的创业建议
    [转帖]如何让菜单项与工具栏按钮对应
    源码下载网站
    [转帖]一段测试代码
    GOF设计模式趣解(23种设计模式) <转自百度空间>
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/3374953.html
Copyright © 2011-2022 走看看