Как установить условную точку останова, если malloc возвращает NULL через gdb - PullRequest
7 голосов
/ 21 декабря 2010

Пример исходного кода:

#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 0x0

Ответы [ 2 ]

6 голосов
/ 22 декабря 2010

Вы можете определить точку выхода 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.

2 голосов
/ 21 декабря 2010

Не могли бы вы просто написать обертку вокруг malloc, которая сохраняет возвращаемое значение, а затем установить условную точку останова для этого значения?

...