永发信息网

如何使core文件可以被 gbd调试

答案:2  悬赏:60  手机版
解决时间 2021-03-05 10:42
如何使core文件可以被 gbd调试
最佳答案
linux下core文件调试方法
在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。
1.core文件的生成开关和大小限制
(1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
(2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。
2.core文件的名称和生成路径
core文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成的core文件不带其它任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。
(1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid
(2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
3.core文件的查看
core文件需要使用gdb来查看。
gdb ./a.out
core-file core.xxxx
使用bt命令即可看到程序出错的地方。
以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。
(1)gdb -core=core.xxxx
file ./a.out
bt
(2)gdb -c core.xxxx
file ./a.out
bt
4.开发板上使用core文件调试
如果开发板的操作系统也是linux,core调试方法依然适用。如果开发板上不支持gdb,可将开发板的环境(依赖库)、可执行文件和core文件拷贝到PC的linux下。
在 PC上调试开发板上产生的core文件,需要使用交叉编译器自带的gdb,并且需要在gdb中指定solib-absolute-prefix和 solib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径。有一种建立配置文件的方法,不需要每次启动gdb都配置以上变量,即:在待运行gdb的路径下建立.gdbinit。
配置文件内容:
set solib-absolute-prefix YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH
handle SIG32 nostop noprint pass
注意:待调试的可执行文件,在编译的时候需要加-g,core文件才能正常显示出错信息!有时候core信息很大,超出了开发板的空间限制,生成的core信息会残缺不全而无法使用,可以通过挂载到PC的方式来规避这一点。
全部回答
在Unix系统下,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要的,本文对此做简单介绍。例如,一个程序cmm_test_tool在运行的时候发生了错误,并生成了一个core文件,如下:-rw-r–r–1rootcmm_test_tool.c-rw-r–r–1rootcmm_test_tool.o-rwxr-xr-x1rootcmm_test_tool-rw——-1rootcore.19344-rw——-1rootcore.19351-rw-r–r–1rootcmm_test_tool.cfg-rw-r–r–1rootcmm_test_tool.res-rw-r–r–1rootcmm_test_tool.log[root@AUTOTEST_SIM2mam2cm]#就可以利用命令gdb进行查找,参数一是应用程序的名称,参数二是core文件,运行gdbcmm_test_toolcore.19344结果如下:[root@AUTOTEST_SIM2mam2cm]#gdbcmm_test_toolcore.19344GNUgdbRedHatLinux(5.2.1-4)Copyright2002FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Type“showcopying”toseetheconditions.ThereisabsolutelynowarrantyforGDB.Type“showwarranty”fordetails.ThisGDBwasconfiguredas“i386-redhat-linux”…Corewasgeneratedby`./cmm_test_tool’.Programterminatedwithsignal11,Segmentationfault.Readingsymbolsfrom/lib/i686/libpthread.so.0…done.Loadedsymbolsfor/lib/i686/libpthread.so.0Readingsymbolsfrom/lib/i686/libm.so.6…done.Loadedsymbolsfor/lib/i686/libm.so.6Readingsymbolsfrom/usr/lib/libz.so.1…done.Loadedsymbolsfor/usr/lib/libz.so.1Readingsymbolsfrom/usr/lib/libstdc++.so.5…done.Loadedsymbolsfor/usr/lib/libstdc++.so.5Readingsymbolsfrom/lib/i686/libc.so.6…done.Loadedsymbolsfor/lib/i686/libc.so.6Readingsymbolsfrom/lib/libgcc_s.so.1…done.Loadedsymbolsfor/lib/libgcc_s.so.1Readingsymbolsfrom/lib/ld-linux.so.2…done.Loadedsymbolsfor/lib/ld-linux.so.2Readingsymbolsfrom/lib/libnss_files.so.2…done.Loadedsymbolsfor/lib/libnss_files.so.2#00×4202cec1in__strtoul_internal()from/lib/i686/libc.so.6(gdb)进入gdb提示符,输入where,找到错误发生的位置和堆栈,如下:(gdb)where#00×4202cec1in__strtoul_internal()from/lib/i686/libc.so.6#10×4202d4e7instrtoul()from/lib/i686/libc.so.6#20×0804b4dainGetMaxIDFromDB(get_type=2,max_id=0×806fd20)atcmm_test_tool.c:788#30×0804b9d7inConstrctVODProgram(vod_program=0×40345bdc)atcmm_test_tool.c:946#40×0804a2f4inTVRequestThread(arg=0×0)atcmm_test_tool.c:372#50×40021941inpthread_start_thread()from/lib/i686/libpthread.so.0(gdb)至此,可以看出文件出错的位置是函数GetMaxIDFromDB,两个参数分别是2和0×806fd20,这个函数位于源代码的788行,基于此,我们就可以有针对性的找到问题的根源,并加以解决。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如果要除去感情
放飞自我一次 释放一下压抑已久的心
伟诚汽车一站式服务我想知道这个在什么地方
想知道: 济南市 济南金科地产 在哪
偃师市洛阳西华逍遥镇牛肉胡辣汤哪位知道具体
养的白掌变成了绿掌,怎么回事呢?
黄义达那女孩对我说
圆的半径增加一倍,圆的面积为什么增加3倍?
达人秀会说话的狗怎么会事
炭鱼乐客餐饮在什么地方啊,我要过去处理事情
已知(m的平方—1)*x的平方—(m+1)x+8=0是
【贾斯丁比伯的歌曲】求一篇关于贾斯汀·比伯
求著名电影的经典对白!英文的~
济南哪里有春考培训?
我恨摩羯座
推荐资讯
电脑开着不动等一下就死机,为什么。
家里贡的观音菩萨掉地上了 有预意吗
什么是洗衣机臭氧洗涤?
经济学研究的三个基本问题是什么?
阅读材料,结合所学知识回答问题:下表是台湾
泰安市海事局的具体位置在哪
跟着播音员念新闻提高口才
1960年一角人民币要什么编号才直钱
现有无标签的四种样品各一瓶:稀蛋清、葡萄糖
情人节送喜欢的女孩子玫瑰花蛋糕怎么样?
走过的是记忆 迈出的是开始 希望你们不要在为
五胡乱华时期 汉族的主要将领和战役
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?