web-dev-qa-db-ja.com

gdbセッションでmallocの呼び出しが失敗する

Cプログラムをデバッグしようとしていますが、gdbは特定の関数の329行目にsegfaultがあることを通知しています。そのため、その関数にブレークポイントを設定し、ステップスルーしようとしています。ただし、68行目に到達すると、gdbから次のような苦情が寄せられます。

(gdb) step
68              next_bb = (basic_block *)malloc(sizeof(basic_block));
(gdb) step
*__GI___libc_malloc (bytes=40) at malloc.c:3621
3621    malloc.c: No such file or directory.
in malloc.c

どういう意味かわかりません。プログラムは1セットを除くすべての入力で完全に実行されるため、このmallocの呼び出しは、プログラムの他の実行中に明らかに成功します。そして、もちろん、私は持っています:

#include <stdlib.h>.

ソースコードは次のとおりです。

    // Block currently being built.
    basic_block *next_bb = NULL;
    // Traverse the list of instructions in the procedure.
    while (curr_instr != NULL)
    {
        simple_op opcode = curr_instr->opcode;
        // If we are not currently building a basic_block then we must start a new one.
        // A new block can be started with any kind of instruction.
        if (!in_block)
        {
            // Create a new basic_block.
            next_bb = (basic_block *)malloc(sizeof(basic_block));
22
Schemer

これは無視しても問題ありません。 gdbは、mallocのソースがないと不平を言っています。そして、ソースをステップスルーしたくないことはほぼ確実です。

2つの簡単な解決策:

  • ステップの代わりにnextを使用してください-関数に降りません

  • 誤ってすでに関数にstepされている場合は、finishを使用して関数のreturnステートメントを実行します。

そして別のアプローチ:

  • コード全体をステップスルーするのではなく、セグメンテーション違反の少し前に中断することもできます。

    • これを行うには、_break <source file>:<line num>_を使用して特定の行にブレークポイントを設定します(たとえば、foo.cの320行目でブレークするには_break foo.c:320_)。
    • または、_break <function name>_を使用して特定の関数を中断することもできます(たとえば、_break foo_はfoo()関数の先頭で中断します)。
25
Timothy Jones