读《debug hacks》

本文介绍GDB调试工具的基础使用方法,包括查看寄存器变量、内存内容及进程映射等技巧,并深入探讨栈帧、内存泄漏、死锁等问题的诊断与解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、笔记

1、p/格式  $变量显示显示某个寄存器的变量。格式可以是浮点型,字符串型。

2、x/格式 地址显示某个内存的内容。
x/10i $pc显示从PC所指地址开始的十条指令。
3、r15 pc
r14 lr
r13 sp
r12 ip暂时保存sp

r11 fp栈帧

LWP轻量级线程

4、p54:调用函数之后,栈上面依次保存了传给函数的参数、调用者的返回地址、上层栈帧指针和函数内部使用的自动变量。此外处理有些函数时,还会用栈来保存寄存器值。每个函数都独有这些信息,称为栈帧。此时需要适当的设置栈帧起始地址的帧指针FP,而栈指针SP一直指向栈的顶端。

5、下面函数执行,如果不输入参数就会发生递归调用的栈溢出。

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX (1UL << 20)

typedef unsigned long long u64;
typedef unsigned int u32;

u32 max_addend = MAX;

u64 sum_till_MAX(u32 n)
{
	u64 sum = 0;
	n++;
	sum = n;
	if( n < max_addend)
	{
		sum += sum_till_MAX(n);
	}
	return sum;
}

int main(int argc, char** argv)
{
	u64 sum = 0;
	if((argc == 2) && isdigit(*(argv[1])))
	{
		max_addend = strtoul(argv[1], NULL, 0);
	}
	
	if(max_addend > MAX || max_addend == 0)
	{
		fprintf(stderr, "INVALID!");
		return 1;
	}
	
	sum = sum_till_MAX(0);
	printf("sum(0..%lu) = %llu\n", max_addend, sum);
	return 0;
}

6、p60:在GDB调试程序是可以用i proc mapping查看该进程的内存映射,显示被调试的进程相对应的maps信息。但是core文件需要用info files命令来获取。

7、p127:栈破坏有时会导致问题难以分析,特别是无法获取backtrace信息,追溯问题现象发生的路径就变得异常困难。此外存在栈破坏,可以说backtrace信息也不完整。

backtrace是根据栈中保存的函数返回地址来显示的。根据栈空间上的返回地址和调试信息得出的栈使用量,依次求出调用者函数。也就是说,调试器backtrace的地址来自进程的栈上。

info reg可以获得寄存器的信息。

8、P151:数组非法访问导致内存破坏,错误的操作数组导致的BUG之一就是缓冲区溢出,也就是说向已经分配的内存空间之外写入数据。特别是这类BUG发生在栈上的缓冲区中,就可能引发安全漏洞。此外,在计算数组的下标时,如果计算错误,就可能算出负下标,也可能引起缓冲区溢出。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char names[] = "book cat dog building vegetbale curry";

void func(void)
{
	char buf[5];
	strcpy(buf,names);
}

int main(void)
{
	func();
	return 0;
}

理解:如就是将数组拷贝超出预先分配在栈上的内容,拷贝到栈上去了,导致覆盖了原先栈上的函数返回地址。这样函数跳转到了错误的地址,这个地址不是操作系统分配给程序地址。

9、P165:死锁,一般程序停止响应要先确认是失去控制还是在等待。用PS命令可以确认(ps ax -L | grep astall),PS命令中如果为R表示进程在运行,如果是S表面在SLEEP,如果是预期之外的SLEEP,大多数情况是陷入了死锁。用GDB attach到该进程上,调查哪里在睡眠。(也可以使用杀死某个进程来调查某个不响应的程序)(钩子函数)

10、P307:内存泄漏,不断用secureCRT发送命令获取内存的变化情况,然后用EXCLE分析该数据,判断是否发生内存泄漏。/proc/meminfo中,Committed_AS可以作为进程的内存泄漏估计,其他需要统计的值是MEMFree、SwapFree、AnonPages和Cached的值。

可以用/proc/<PID>/mem快速读取进程的内存内容。

二、其他参考资源

1、优秀笔记

2、目录

### 回答1: Debug hacks指的是在软件或应用程序开发的过程中,使用不正规方法来定位和修正程序的某些问题或缺陷。通常,这些方法会利用一些不受支持的程序或工具,或修改已存在的代码,以使程序在调试和测试期间更容易诊断问题。 Debug hacks的使用在软件开发中非常普遍,特别是在开发软件时,时间和资源很紧缺的情况下。但是,这些方法可能会损害程序的安全性、可靠性和稳定性。因此,除非情况紧急或必须,一般不建议使用Debug hacks方法。 Debug hacks的一些常见技巧包括调试器、反汇编、内存操作、代码注入、代码覆盖和补丁等。而使用Debug hacks的主要风险包括: 1. 不可预知的问题:由于不受支持的方法,程序可能会出现意外的行为,导致开发者难以处理。 2. 安全问题:由于Debug hacks方法可能会在程序中注入代码,因此,黑客可以利用这些注入代码来攻击程序或系统。 3. 兼容性问题:由于Debug hacks方法往往依赖于特定的程序版本或操作系统,因此可能在不同的环境下出现兼容性问题。 因此,使用Debug hacks时,必须谨慎,并确保只在必要情况下使用。在可能的情况下,应该使用正规的调试和测试方法来诊断和修复程序问题。 ### 回答2: debug hacks是一种程序员常用的调试技巧,通过在代码中插入一些调试代码来定位程序中的错误并修复它们。通常,调试代码会在程序执行时输出某些信息,例如变量的值、函数的返回值或程序运行流程。这些输出信息可以帮助程序员找到程序中的错误并解决它们。 使用debug hacks的过程中,程序员需要仔细考虑调试代码的位置和内容,以避免引入新的错误或影响程序的性能。另外,调试代码在定位错误后必须及时删除,以防止对程序的影响。 常用的debug hacks包括: 1. 打印调试信息:在代码中插入打印语句,输出变量的值、函数的返回值或程序运行流程等信息。 2. 调试断点:在代码中设置调试断点,当程序执行到断点处时,程序会停止执行,程序员可以在此处检查代码并逐步执行程序。 3. 远程调试:通过网络连接到远程计算机,在另一台计算机上调试程序。 4. 内存调试:使用特定的工具检查程序的内存使用情况,找出内存泄漏和其他内存相关问题。 综上所述,debug hacks是程序员调试程序时常用的技巧,它可以帮助程序员定位程序中隐藏的错误并修复它们。这需要程序员仔细考虑调试代码的编写,以免引入新的错误或影响程序的性能。 ### 回答3: debug hacks是一种用于排除软件或电脑系统中的错误的技术和工具。他们旨在帮助开发人员或IT专业人员快速而准确地识别和修正故障。debug hacks通常包括一系列的代码片段、工具和技术,可以帮助技术人员在开发和测试软件时进行调试和错误修复。 debug hacks包括很多常用的技术,例如:断点调试、日志输出、仿真调试以及追踪代码执行。这些工具都可以帮助开发人员快速定位和解决各种类型的软件错误,包括语法错误、代码逻辑错误、内存泄露和性能问题等。 debug hacks是一项非常重要的技术。在现代软件市场中,软件错误不仅影响软件的质量和用户体验,而且还会对业务产生严重的影响。因此开发人员和IT专业人员需要掌握这些技术,并应用它们来最大化软件的效益。 总之,debug hacks是一种用于排除软件故障的关键技术,可以帮助开发人员快速识别和解决软件错误。掌握这些技术可以提高软件的质量,保证软件的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值