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));
これは無視しても問題ありません。 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()
関数の先頭で中断します)。