1 #include <stdio.h>
2
3 int func(int n)
4 {
// sum=-0x8001e98, i=0x7fff
→ 5 int sum=0,i;
6 for(i=0;i<n;i++)
7 {
8 sum +=i;
9 }
10 return sum;
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。p/a i
c 按字符格式显示变量。p/c i
f 按浮点数格式显示变量。
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。p/a i
c 按字符格式显示变量。p/c i
f 按浮点数格式显示变量。
for(i=1;i<100;i++)
{
result +=i;
a[i] = i;
}
gef➤ x/100dw a
0x7fffffffda80: 0 1 2 3
0x7fffffffda90: 4 5 6 7
0x7fffffffdaa0: 8 9 10 11
0x7fffffffdab0: 12 13 14 15
*
array@len :也可以看到内存,如p *
a@100,查看100个a的内存的值gef➤ p/d *a@100
$2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99}
gef➤ bt
#0 main (argc=0x6, argv=0x7fffffffde58) at test-1.c:20
gef➤ x/20xw 0x7fffffffde58
0x7fffffffde58: 0xffffe23d 0x00007fff 0xffffe260 0x00007fff
0x7fffffffde68: 0xffffe263 0x00007fff 0xffffe266 0x00007fff
0x7fffffffde78: 0xffffe269 0x00007fff 0xffffe26c 0x00007fff
0x7fffffffde88: 0x00000000 0x00000000 0xffffe26f 0x00007fff
0x7fffffffde98: 0xffffe2aa 0x00007fff 0xffffe2b5 0x00007fff
# 64位系统八个字节为一组,小端序排列,如第一组地址为0x00007fff-ffffe23d
# 由此可以看出main函数传入参数是双重指针
gef➤ x/100cb 0x00007fffffffe23d
0x7fffffffe23d: 0x2f 0x72 0x6f 0x6f 0x74 0x2f 0x6c 0x65
0x7fffffffe245: 0x61 0x72 0x6e 0x5f 0x6c 0x69 0x6e 0x75
gef➤ x/8db 0x00007fffffffe260
0x7fffffffe260: 49 48 0 50 48 0 51 48
readelf -s test
生成/拷贝符号表
去除符号表,生成发布程序
objcopy --strip-debug test test.release
使用符号表进行程序debug
断点
条件断点
观察点:在某个变量被修改的时候停掉
watch
*
0x00007fffffffddb0 (栈顶地址指向的内存)
Hardware watchpoint 4: *0x00007fffffffddb0
rwatch
awatch
捕捉点:捕捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。
commands 断点号
print sum
print i
end