示例源代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define GIGABYTE 1024*1024*1024
int
main (void)
{
void *foo;
int result;
foo = (void *) malloc (GIGABYTE*5);
result = errno;
if (foo != NULL) {
return 2;
} else {
fprintf (stderr, "ERROR: %d\n", result);
return 1;
}
return 0;
}问题:
0x0
# gdb -silent ./huge_malloc)停止/停止执行,如果malloc()返回0x0,不需要检查foo是否为发布于 2010-12-21 23:38:47
您可以识别malloc的退出点并在其中放置一个条件断点。例如:
(gdb) tbreak main
Breakpoint 1 at 0x4005c4: file t.c, line 13.
(gdb) r
Starting program: /var/tmp/a.out
main () at t.c:13
13 foo = malloc (64);
(gdb) br *__libc_malloc+211 if $rax==0
Breakpoint 2 at 0x7f26d143ea93
(gdb) n
14 foo = malloc (GIGABYTE*64);
(gdb) p foo
$1 = (void *) 0x21dc010
(gdb) n
Breakpoint 2, 0x00007f26d143ea93 in malloc () from /lib/libc.so.6注意,我添加了一个首先成功的malloc调用,以说明断点只触发一个NULL返回值。断点地址可能随libc版本的不同而不同,我发现它是通过逐步使用malloc和nexti来实现的,直到我到达ret指令。
发布于 2010-12-21 13:10:20
您就不能在malloc上编写一个包装器,保存返回值,然后在该值上设置一个条件断点?
https://stackoverflow.com/questions/4498965
复制相似问题