如果malloc通过gdb返回NULL,如何设置条件断点

时间:2010-12-21 11:53:30

标签: c linux gdb malloc

示例源代码:

#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;
}

问题:

  • 如果# gdb -silent ./huge_malloc返回malloc()没有检查是否指示gdb(0x0停止/暂停执行foo0x0

2 个答案:

答案 0 :(得分:6)

您可以识别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指令。

答案 1 :(得分:2)

难道你不能只在malloc周围编写一个保存返回值然后在该值上设置条件断点的包装器吗?