進階gdb之core dump的除錯
core dump的除錯
Basic Perl等語言處理的可以說是User的資料, C可以說在那邊把資料在記憶體移來移去, 組語可說把資料在暫存器搬來搬去, 越低階的處理表示握有的資源越少
所以C處理不好的話很容易記憶體跨出範圍, 或者系統毀了(panic), 這時都會產生一個core dump, 就是毀掉的瞬間記憶體內部的內容會搬到一個檔案core, core file 包含了程式的read/write的memory部份, 也就是程式躺在記憶體時的狀態, executable只是一個可執行檔也就是程式躺在硬碟時。 gdb可以根據這個檔來除錯,只是這時的target是core 或exec 不是remote。 通常這可以拿來做系統毀掉時的debug
gdb a.out core 命令列上給executable與core file |
用下面程式做例子
#include <stdio.h> |
跑它之後產生core dump檔並用gdb來看它
[cyril@megami cyril]gdb a.out core |
當然這例子很簡單,不過不用自己一步步追到死掉的地方, gdb a.out core自動用file命令load了symbol table進來,所以我可以用 print x來看它。通常捉到問題點就是用bt(backtrace)捉出之前到底叫了甚麼。
產生 core dump 的方法
這篇是 "Learning core dump from the hard way", 寫下幾個注意事項, 後來才發現 man core 就可以看到全部東西:
測試
若執行的程式有讀 terminal input, 可直接輸入 ctrl + \ 送出 SIGQUIT。或用指令 kill -QUIT PID 或 kill -ABRT PID, 要求程式產生 core dump, 藉此測試目前的設定是否 ok。
參考《從 /proc/PID/status 了解執行中程式處理 signal 的方式》, 先確認 signal handler 沒有被覆蓋掉, 才可放心測試。
ulimit / setrlimit(RLIMIT_CORE, ...)
Ubuntu 預設為 ulimit -c 0, 表示不產生 core dump, 所以要先執行 ulimit -c unlimited 允許產生 core dump。可以將這行寫到 ~/.bashrc 裡, 以後就預設會產生 core dump。或在程式裡呼叫 setrlimit(RLIMIT_CORE, &limit) 也可以。
/proc/sys/kernel/core_pattern
預設 core dump 的檔名可能不合使用, 參考《setting the core dump name schema》, 可用
$ echo "core.%e.%p.%t"| sudo tee /proc/sys/kernel/core_pattern
改變 core dump 的檔名, 這樣檔名會記錄是程式名稱、PID、發生的時間。在 multi-process 或 multi-thread 時特別有用。若希望每次開機都會生效, 則要在 /etc/sysctl.conf 加入 kernel.core_pattern = core.%e.%p.%t。
core pattern 可以是 "|PROGRAM", 這樣會將 core dump 導到 PROGRAM 的標準輸入, 可以自己寫 PROGRAM 做控制。像是 core dump 太頻繁時, 取樣留下幾個就好, 以免一下就塞爆硬碟。同樣的, %e 那些參數也可以接在 PROGRAM 後當參數用, 像是 "|PROGRAM core.%e.%p.%t", 自己的 PROGRAM 就能從 argv[1] 裡取得適合的檔名。需要特別注意的是, | 和 PROGRAM 之間不可以有空白。
setuid / setgid
若確認 ulimit -c 有設好, core_pattern 沒寫到奇怪的地方 (像是 /dev/null), 硬碟也仍有空間, 卻仍無法產生 core dump, 可能是用到 setuid。用 ls -l 檢查一下, 或用 strace -esetuid 檢查。Linux 為了安全考量, 在使用 setuid/setgid 後, 會自動禁用 core dump。
若確實有觸發 setuid 的話, 在 setuid 後執行:
prctl(PR_SET_DUMPABLE,1);
重新允許產生 core dump, 應該就 ok 了。
2013-03-26 更新
裝 Ubuntu 12.04 後, 發覺 /etc/sysctrl.conf 的設定沒有生效, 查了一下才發覺 apport 覆寫了 /proc/sys/kernel/core_pattern, 參考這裡關掉它, /etc/sysctrl.conf 的值應該可如預期作用:
$ vi /etc/default/apport # 更新成 "enabled=0"
進階gdb之core dump的除錯的更多相关文章
- ZT 用gdb调试core dump文件
用gdb调试core dump文件 转载自:http://blog.chinaunix.net/u2/83905/showart_2134570.html 在Unix系统下,应用程序崩溃,一般会产生c ...
- Sysrq 诊断系统故障 与 gdb 调试core dump
1. 典型应用场景如: 1)系统进入了挂死状态(如调度出现异常.或系统负荷过重),但仍能响应中断,此时可以通过Sysrq魔术键(c)手工触发panic,结合kdump,就能收集到vmcore信息 ...
- [skill][debug][gdb] 使用core dump 进行GDB
core dump 扫盲:https://wiki.archlinux.org/index.php/Core_dump 1. 人为制作 core dump 1.1 实时在线生成core dump. ...
- [笔记]用gdb调试core dump
总是隔一段时间才写一次C++,有些东西老是用完就忘了……记一下如何用gdb来调试core dump免得到时候又忘记. 首先需要设置core file的大小,默认是0所以不设不会生成core file ...
- Linux gdb分析core dump文件
文章目录1. coredump1.1 coredump简介1.2 coredump的文件存储路径1.3 coredump产生的条件1.4 coredump产生原因2. 测试生成coredump1. c ...
- Unix 用gdb分析core dump文件
产生core文件条件 用ulimit -c 指定core文件大小来开启core文件的生成,如:ulimit -c unlimited 用gdb分析core文件的条件 可执行程序在编译时,需加入-g参数 ...
- gdb调试core dump使用
什么是coredump? Coredump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照.操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存.寄存器状态.运行堆 ...
- GDB和Core Dump使用笔记
一.GNU C编译器(即GCC) GCC使用 1 .gcc -g hello.c -o hello 编译生成可执行文件 2.gdb hello 启动GDB ...
- 使用GDB 追踪依赖poco的so程序,core dump文件分析.
前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...
随机推荐
- shape和reshape
import numpy as np a = np.array([1,2,3,4,5,6,7,8]) #一维数组 print(a.shape[0]) #值为8,因为有8个数据 print(a.shap ...
- canvas---从基础到实战
canvas是H5新增的一个元素,可以用来描绘各种你想描绘的东西. canvas本身没有绘制能力,你可以把它当做一个容器,需要我们用脚本,也就是js来给他灌满水. 兼容性 1. IE9版本以上.Fir ...
- 【转载】MySQL查询当天0点,昨天时间
转载自:https://blog.csdn.net/qq_22158021/article/details/78800299 今天是 SELECT NOW();-- 2015-09-28 13:48: ...
- Linux 下安装sql server 时 2G内存限制的最新(2019-08-15) 解决方案
关于 sqlserver 在linux下安装时有最小内存限制的问题,网上有很多类似的说明,那些操作都是正确的,如果不成功可能 “姿势”不对. 需要注意的是:不能使用最新版本!!! 不能在线下载!!! ...
- 使用aop和BindingResult进行参数验证
1.在需要校验的参数名上面添加注解 2.在web层接收参数(参数前面使用@Valid进行标记,后面必须紧跟参数bindingResult,存储参数的错误信息) 3.使用aop进行校验信息统一处理 @C ...
- jQuery遍历之同级遍历
html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- 如何在Mac上将视频刻录到DVD / ISO文件
如果您希望将喜爱的视频转换为DVD / Blu-ray光盘以进行物理备份或播放,则Mac版Wondershare UniConverter可以专业地完成任务.今天的教程就是如何在Mac上轻松刻录DVD ...
- 【leetcode】435. Non-overlapping Intervals
题目如下: Given a collection of intervals, find the minimum number of intervals you need to remove to ma ...
- Delphi ini文件结构简介
一.INI文件的结构:; 注释[小节名]关键字=值 INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值. 值的类型有三种:字符串.整型数值和布尔值.其中字符串存贮在INI ...
- hdu 4352 XHXJ's LIS (数位dp+状态压缩)
Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully readin ...