【问题标题】:How to set conditional breakpoint if malloc returns NULL via gdb如果 malloc 通过 gdb 返回 NULL,如何设置条件断点
【发布时间】:2010-12-21 11:53:30
【问题描述】:

示例源代码:

#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 (# gdb -silent ./huge_malloc) 停止/暂停执行,如果 malloc() 返回 0x0没有检查 foo 是否为 @987654327 @

【问题讨论】:

  • 您能解释一下您要做什么(特别是为什么您要区分malloc 的返回值和foo 的结果值)。
  • 简单地说,只要 malloc() 返回 NULL 就“中断”——上面的源代码只是一个例子。变量名(在本例中为 foo),可能以其他方式命名。
  • 作为一种变通方法,也许您可​​以中断malloc(),然后使用命令列表首先退出malloc(),然后如果$eax != 0 有条件地继续?
  • @Georg: 如何通过 gdb 来实现?
  • 只是一个想法,我还没有尝试过,但是看看here

标签: c linux gdb malloc


【解决方案1】:

您可以识别 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 版本而异,我通过 mallocnexti 逐步找到它,直到我点击 ret 指令。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不幸的是,这是不可能的。上面的来源只是一个例子——我不能改变来源。
    • @Aaron: 但是你可以将malloc 定义为mymalloc(使用-D),强制包含所有源文件的必要头文件,...?
    • @Aaron: GNU ld 有一个-wrap 标志,可以用于这类事情,不需要重新编译其他源文件来适应包装器
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多