• 调试与分析


    一、获取内核转储

    大多数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 文件生成图片

  • 相关阅读:
    LCG(linear congruential generator): 一种简单的随机数生成算法
    (转载)STL map与Boost unordered_map的比较
    永远让比较函数对相等的值返回false
    NYOJ 654喜欢玩warcraft的ltl(01背包/常数级优化)
    Java杂记
    流量控制与拥塞控制
    PHP获取当前页面地址
    表单验证实例
    博客几种可选代码配色方案
    $_POST,$_GET,$_REQUEST区分
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/3374953.html
Copyright © 2020-2023  润新知