gdb可以跟踪内存分配日志

gdb可以跟踪内存分配日志,第1张

可以。当程序被停住时,可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。用gdb调试程序时,可以使用“ set logging on ”命令把执行gdb的过程记录下来,方便以后自己参考或是别人帮忙分析。默认的日志文件是“ gdbtxt ”。

GDB是GNU开原组织旗下一款强大的代码调试工具,使用GDB可以自定义程序运行方式;让程序停止在你指定的位置设置断点;在停止点查看当前程序的状态:变量、寄存器的值;动态改变程序的状态。

GNU调试器(GNU Debugger, GDB)是一个开源的源代码级的调试工具,其性能优良、功能齐全、易于使用,在嵌入式系统开发过程中扮演着越来越重要的角色。接下来是我为大家收集的[Linux]gdb查看内存命令,希望能帮到大家。

[Linux]gdb查看内存区命令

用gdb查看内存

格式: x /nfu

说明

x 是 examine 的缩写

n表示要显示的内存单元的个数

f表示显示方式, 可取如下值

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

i 指令地址格式

c 按字符格式显示变量。

f 按浮点数格式显示变量。

u表示一个地址单元的长度

b表示单字节,

h表示双字节,

w表示四字节,

g表示八字节

Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),

t(binary), f(float), a(address), i(instruction), c(char) and s(string)

Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes)

举例

x/3uh buf

表示从内存地址buf读取内容,

h表示以双字节为一个单位,

3表示三个单位,

u表示按十六进制显示

例子:

n是个局部变量

Breakpoint 1, main (argc=1, argv=0xbffff3a4) at calcc:7

7 int n = atoi(argv[1]);

(gdb) print &n

$1 = (int ) 0xbffff2ec

(gdb) x 0xbffff2ec

0xbffff2ec: 0x00282ff4

(gdb) print (int ) 0xbffff2ec

$2 = 2633716

(gdb) x /4xw 0xbffff2ec

0xbffff2ec: 0x00282ff4 0x080484e0 0x00000000 0xbffff378

(gdb) x /4dw 0xbffff2ec

0xbffff2ec: 2633716 134513888 0 -1073745032

(gdb)

看了“[Linux]gdb查看内存区命令”还想看:

1 Linux使用dmidecode命令查看内存型号

2 Linux下查看CPU型号,内存大小,硬盘空间命令

3 如何在Linux命令行中查看目录的大小

4 LINUX 查看硬件配置命令的教程

gdb 查看 core 文件

基本上

core 文件就是一个包含了程序崩溃时这个进程的所有信息的文件。在那 “遥远的黄金年代”,程序员不得不把 core 文件以十六进制的方式显示

出来,然后满头大汗的阅读机器码的手册,但是现在事情就简单得多了。顺便说一下, 在 FreeBSD 和其他的 44BSD 系统下,core 文件都叫作

prognamecore 而不是简单叫 core,这样可以很清楚的表示出这个 core

文件是属于哪个 程序。

1 要检查一个 core 文件,首先用 gdb 可执行文件名

来调试产生core文件的可执行程序:

2 命令 core会分析 可执行程序名core

文件

注:如果当前不是 core 文件所在目录,首先要执行 dir

/可执行程序名core的路径/。

(gdb)core 可执行程序名core

举例:

$gdb aout

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 413 (i386-unknown-freebsd), Copyright 1994 Free

Software Foundation, Inc

(gdb)core

aoutcore

Core was generated by `aout'

Program terminated with

signal 11, Segmentation fault

Cannot access memory at address

0x7020796d

#0 0x164a in bazz (anint=0x5) at tempc:17

(gdb)

这种情况下,运行的程序叫 aout,因此 core 文件 就叫

aoutcore。我们知道程序崩溃的原因就是函数 bazz 试图访问一块不属于它的内存。

有时候,能知道一个函数是怎么被调用的是非常有用处的。因为在一个复杂的程序里面问题可能会发生在函数调用栈上面很远的地方。

3

命令 bt 会让 gdb

输出函数调用栈的回溯追踪

(gdb)bt

#0 0x164a in bazz (anint=0x5) at tempc:17

#1 0xefbfd888 in end ()

#2 0x162c in main () at tempc:11

(gdb)

函数 end() 在一个程序崩溃的时候将被调用;

在本例

中,函数 bazz()

是从 main()中被调用的。

以上就是关于gdb可以跟踪内存分配日志全部的内容,包括:gdb可以跟踪内存分配日志、[Linux]gdb查看内存区命令、gdb 查程序从哪行core等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10217361.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存