初学GDB(2)

2024-09-01 00:38
文章标签 gdb 初学

本文主要是介绍初学GDB(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

The C Programming Language中1.9节的程序为例,试用了以下命令:
1.backtrace,简写bt,查看函数调用的顺序(函数调用栈的信息);
2.frame N,切换到栈编号为N的上下文中;
3.info frame,简写info f,查看当前函数调用的栈帧信息 ;
4.info locals,查看当前局部变量的值;
5.info args,查看当前函数参数的值;
6.set pagination off,关闭分页显示;
7.l 1,50,显示程序的第1-50行;

注意main()中调用getlines的时候实参是line和MAXLINE,getlines的形参是s和lim,在16行的断点处查看line的地址,为0xbfffe7bc,在第29行的断点处发现s=0xbfffe7bc,两者一致,说明了把数组名作为参数时,传递给函数的是数组起始元素的地址,所以getlines中对s进行修改也就是对main中的line进行修改,而无需特地返回一个修改后的数组。MAXLINE是宏,暂时无法直接查看,似乎在用gcc时要设置其他参数才可。

记录如下:

xxx@xxx-VirtualBox:~/test$ gdb 1-9 -q
Reading symbols from 1-9...done.
(gdb) set pagination off
(gdb) l 1,50
1	#include <stdio.h>
2	
3	#define MAXLINE 1000
4	
5	int getlines(char line[], int maxline);
6	void copy(char to[], char from[]);
7	
8	int main()
9	{
10		int len;
11		int max;
12		char line[MAXLINE];
13		char longest[MAXLINE];
14	
15		max = 0;
16		while ((len = getlines(line, MAXLINE)) > 0)
17			if (len > max) {
18				max = len;
19				copy(longest, line);
20			}
21		if (max > 0)
22			printf("%s", longest);
23		return 0;
24	}
25	
26	int getlines(char s[], int lim)
27	{
28		int c, i;
29		for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
30			s[i] = c;
31		if (c == '\n') {
32			s[i] = c;
33			++i;
34		}
35		s[i] = '\0';
36		return i;
37	}
38	
39	void copy(char to[], char from[])
40	{
41		int i;
42		i = 0;
43		while ((to[i] = from[i]) != '\0')
44			++i;
45	}
(gdb) b 16
Breakpoint 1 at 0x80484c4: file 1-9.c, line 16.
(gdb) b 29
Breakpoint 2 at 0x8048563: file 1-9.c, line 29.
(gdb) b 43
Breakpoint 3 at 0x80485d0: file 1-9.c, line 43.
(gdb) r
Starting program: /home/ant/test/1-9 Breakpoint 1, main () at 1-9.c:16
16		while ((len = getlines(line, MAXLINE)) > 0)
(gdb) p &line
$1 = (char (*)[1000]) 0xbfffe7bc
(gdb) info f
Stack level 0, frame at 0xbfffefb0:eip = 0x80484c4 in main (1-9.c:16); saved eip = 0xb7e1e637source language c.Arglist at 0xbfffef98, args: Locals at 0xbfffef98, Previous frame's sp is 0xbfffefb0Saved registers:ebp at 0xbfffef98, eip at 0xbfffefac
(gdb) c
Continuing.Breakpoint 2, getlines (s=0xbfffe7bc "", lim=1000) at 1-9.c:29
29		for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
(gdb) bt
#0  getlines (s=0xbfffe7bc "", lim=1000) at 1-9.c:29
#1  0x0804850d in main () at 1-9.c:16
(gdb) frame 0
#0  getlines (s=0xbfffe7bc "", lim=1000) at 1-9.c:29
29		for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
(gdb) info locals
c = 0
i = 0
(gdb) frame 1
#1  0x0804850d in main () at 1-9.c:16
16		while ((len = getlines(line, MAXLINE)) > 0)
(gdb) info locals
len = 0
max = 0
line = '\000' <repeats 65 times>, "\360\377\267\000\000\000\000\000\000\000\000\251\071\377\267\000\220\373\267\000\220\373\267\260Q\375\267(\352\377\277\270\022\376\267\000\220\373\267\034*\000\000\003\000\000\000\062\000\000\000\377\377\377\377\000\000\000\000,\001\000\000A\a\376\267\000\000\000\000\000\000\033\000\\\361\032\000\\\361\032\000\000\000\000\000\005\000\000\000\000\000\033\000\000\060\033\000\324.\033\000\034Z\033\000\000\360\032\000\003", '\000' <repeats 31 times>...
longest = "P\345td\214P\026\000\214P\026\000\214P\026\000\234a\000\000\234a\000\000\004\000\000\000\004\000\000\000Q\345td", '\000' <repeats 20 times>, "\006\000\000\000\020\000\000\000R\345tdi2\376\267h\356\377\277\260}\373\267͒ᷘ\356\377\277\222\177\376\267", '\000' <repeats 12 times>, "\003\000\000\000GNU\000\335Q\222\247\000\000\000\000\004\243\376\267h\356\377\277\000\000\000\000u\272\375\267`?\376\267\345\222\341\267\067\266\375\267\000\000\000\000X\370\377\267\000\000\000\000d\356\377\277`\356\377\277\020ii\r\000\002\000\000d\356\377\277\071>\376\267\244\201\340\267\016\002\000\000\260Q\375\267\307\016\340==F\376"...
(gdb) frame 0
#0  getlines (s=0xbfffe7bc "", lim=1000) at 1-9.c:29
29		for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
(gdb) c
Continuing.
abBreakpoint 3, copy (to=0xbfffeba4 "P\345td\214P\026", from=0xbfffe7bc "ab\n") at 1-9.c:43
43		while ((to[i] = from[i]) != '\0')
(gdb) bt
#0  copy (to=0xbfffeba4 "P\345td\214P\026", from=0xbfffe7bc "ab\n") at 1-9.c:43
#1  0x080484f6 in main () at 1-9.c:19
(gdb) info locals
i = 0
(gdb) n
44			++i;
(gdb) n
43		while ((to[i] = from[i]) != '\0')
(gdb) p to
$2 = 0xbfffeba4 "a\345td\214P\026"
(gdb) c
Continuing.Breakpoint 2, getlines (s=0xbfffe7bc "ab\n", lim=1000) at 1-9.c:29
29		for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
(gdb) Quit

这篇关于初学GDB(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125457

相关文章

GDB调试程序入门

http://blog.csdn.net/haoel/article/details/2880 用GDB调试程序 GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所

git的使用和gdb工具

1.git的使用 首先现在gitee上新建一个仓库 然后复制克隆链接到本地仓库 在本地仓库中,我们可以用git status查看仓库状态 我们要提交代码就是要三步 git add 文件名 git commit -m "写提交的日志" git push 将代码上传到远端仓库 然后你就完成一次提交了 2.调试工具gdb 程序的发布模式有两种,de

GDB watch starti i files

watch break starti 在程序的最初开始运行的位置处断下来 ​​ i files 查看程序及加载的 so 的 sections ​​

GDB 查看汇编

查看汇编 x disassemble

【Linux】GDB的使用(工具篇)

文章目录 背景GDB的基本功能       背景 Linux gcc/g++出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项程序的发布方式有两种,debug模式和release模式 debug 与 release的区别 在软件开发中,Debug(调试)和 Release(发布)版本有以下一些主要区别:

GDB 反向调试

使用调试器时最常用的功能就是step, next, continue,这几个调试命令都是“往下执行”的, 但是很多时候会有这种需求:你在调试的过程中多跳过了几步而错过中间过程,这时候不得不重头调试一遍,非常麻烦。而GDB从7.0版本开始支持反向调试功能,也就是允许你倒退着运行程序,或者说撤销程序执行的步骤从而会到以前的状态。   直观地来看,加入你正在使用GDB7.0以上版本的调试器并且运行在

Vue初学-简易计算器

最近在学习Vue的指令,做了一个简易计算器,比较适合刚入门的人参考学习。用到的知识点有: 1.插值表达式 2.v-model,双向绑定+、-、*、/、**等操作符 3.v-show,控制操作数2是否显示,乘方时不显示操作数2 4.methods选项,定义了calculate ()方法,实现各种运算 5.watch选项,监听selected的值的变化。 下面是程序的执行效果: 如果选择的是**乘

Mindspore 初学教程 - 3. Tensor 张量

张量(Tensor)是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在  n n n 维空间内,有  n r n^{r} nr 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。 r r r 称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 张量是一种特殊的数据结构,

Python 初学入门必会基础知识

引言 Python 是一种易学易用的编程语言,适用于各种应用场景,包括网站开发、数据分析、人工智能等。对于零基础的学习者来说,掌握 Python 编程语言是一个很好的起点。本文将详细介绍零基础学习 Python 所需的知识点,帮助初学者快速入门。 CSDN大礼包:《2024年最新全套学习资料包》免费分享 1.首先需要安装Python 学习 Python 的第一步是安装 Python

关于GDB运行时No symbol table is loaded. Use the “file“ command.的解决方法

最近有同学问GDB使用的问题,对此做一个整理。 首先,GDB已经报错file找不到了,那可以运行file test检测一下 (gdb) file testReading symbols from test...(no debugging symbols found)...done. 发现找不到可执行文件,所以问题应该在于编译时候没有加上ggdb3,重新编译一下 ty@ubuntu: