gdb怎么查看程序是在哪行代码那里执行了exit退出
发布网友
发布时间:2022-04-22 06:14
我来回答
共1个回答
热心网友
时间:2022-04-08 11:32
gdb 查看 core 文件
基本上
core 文件就是一个包含了程序崩溃时这个进程的所有信息的文件。在那 “遥远的黄金年代”,程序员不得不把 core 文件以十六进制的方式显示
出来,然后满头大汗的阅读机器码的手册,但是现在事情就简单得多了。顺便说一下, 在 FreeBSD 和其他的 4.4BSD 系统下,core 文件都叫作
progname.core 而不是简单叫 core,这样可以很清楚的表示出这个 core
文件是属于哪个 程序。
1. 要检查一个 core 文件,首先用 gdb 可执行文件名
来调试产生core文件的可执行程序:
2. 命令 core会分析 可执行程序名.core
文件
注:如果当前不是 core 文件所在目录,首先要执行 dir
/可执行程序名.core的路径/。
(gdb)core 可执行程序名.core
举例:
$gdb a.out
GDB is free software and you are
welcome to distribute copies of it under certain conditions; type "show copying"
to see the conditions. There is absolutely no warranty for GDB; type "show
warranty" for details. GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free
Software Foundation, Inc.
(gdb)core
a.out.core
Core was generated by `a.out'.
Program terminated with
signal 11, Segmentation fault.
Cannot access memory at address
0x7020796d.
#0 0x164a in bazz (anint=0x5) at temp.c:17
(gdb)
这种情况下,运行的程序叫 a.out,因此 core 文件 就叫
a.out.core。我们知道程序崩溃的原因就是函数 bazz 试图访问一块不属于它的内存。
有时候,能知道一个函数是怎么被调用的是非常有用处的。因为在一个复杂的程序里面问题可能会发生在函数调用栈上面很远的地方。
3.
命令 bt 会让 gdb
输出函数调用栈的回溯追踪
(gdb)bt
#0 0x164a in bazz (anint=0x5) at temp.c:17
#1 0xefbfd888 in end ()
#2 0x162c in main () at temp.c:11
(gdb)
函数 end() 在一个程序崩溃的时候将被调用;
在本例
中,函数 bazz()
是从 main()中被调用的。
gdb怎么查看程序是在哪行代码那里执行了exit退出
1. 要检查一个 core 文件,首先用 gdb 可执行文件名 来调试产生core文件的可执行程序:2. 命令 core会分析 可执行程序名.core 文件 注:如果当前不是 core 文件所在目录,首先要执行 dir /可执行程序名.core的路径/。(gdb)core 可执行程序名.core 举例:gdb a.out GDB is free software and ...
如何gdb调试一个运行中的进程
第一步 编译一个死循环程序。/* File name malloc.c*/ include <stdio.h> include <stdlib.h> include <string.h> void getmem(void **p, int num){ p = (void *)malloc(num);} void test(void){ char *str = NULL;getmem((void **)&str, 100);strcpy(str, "Hello")...
谁知道.gdb格式的文件用什么打开?
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、动态的改变你程序的执行环境。从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细...
如何使用gdb调试多进程
进入gdb以后,我们可以使用show follow-fork-mode来查看目前的跟踪模式。可以看到目前使用的模式是parent。然而,有的时候,我们想同时调试父进程和子进程,以上的方法就不能满足了。Linux提供了set detach-on-fork mode命令来供我们使用。其使用的mode可以是以下的一种:on 只调试父进程或子进程的其中一...
gdb命令中attach使用
查找进程id:ps -fu YOUR_USER_NAME 运行gdb:gdb (gdb)attach xxxxx--- xxxxx为利用ps命令获得的子进程process id (gdb)stop--- 这点很重要,你需要先暂停那个子进程,然后设置一些断点和一些Watch (gdb)break37-- 在result = wib(value, div);这行设置一个断点,可以使用list命令察看源代码 Bre...
Centos进程状态详解
在linux下,通过ps命令我们能够查看到系统中存在的进程,以及它们的状态: R(TASK_RUNNING),可执行状态。 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器...
CPU和CPUID是什么关系?
6. 继续执行 Ring3 的代码由此可知,在调用 SYSENTER 进入 Ring0 之前,一定需要通过 wrmsr 指令设置好 Ring0 代码的相关信息,在调用 SYSEXIT 之前,还要保证寄存器edx、ecx 的正确性。如何得知 CPU 是否支持 sysenter/sysexit 指令根据Intel 的 CPU 手册,我们可以通过 CPUID 指令来查看 CPU 是否支持 sysenter/sys...
linux gdb backtrace 怎么实现的
通常情况系,程序发生段错误时系统会发送SIGSEGV信号给程序,缺省处理是退出函数。我们可以使用 signal(SIGSEGV, &your_function);函数来接管SIGSEGV信号的处理,程序在发生段错误后,自动调用我们准备好的函数,从而在那个函数里来获取当前函数调用栈。举例如下:[cpp] view plain copy print?include <stdio.h...
shell命令解释器源代码
�8�5 exit:退出ysh。�8�5 jobs:打印当前正在后台执行的作业和挂起的作业信息。输出信息应采用便于用户理解的格式。�8�5 fg %<int>:把<int>所标识的作业放到前台运行,如果这个作业原来已经停止,那么他继续运行。Shell应当在打印新的命令...
CLion中调试MySQL让你程序调试更轻松一点clion调试mysql
在GDB配置窗口中,勾选“Use remote debugging”,在“Host”栏中输入”localhost”,在“Port”栏中输入”2333”,然后点击“OK”按钮保存配置。成功添加调试器之后,我们还需要在代码中添加断点,这样才能进入调试模式。在需要断点的行数处使用快捷键Ctrl+F8添加断点。添加完断点后,点击“Debug”按钮开始...