2012-02-10 21 views
18

Bir C programında hata ayıklamaya çalışıyorum ve gdb bana belirli bir işlevin 329 satırında bir segfault olduğunu söylüyor. Bu yüzden bu fonksiyon için bir mola noktası belirledim ve adım atmaya çalışıyorum. Bunun ne anlama geldiğini bilmiyorumgdb oturumunda malloc başarısızlığı çağrısı

(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 

: Çizgiyi 68 vurduğuz Ancak, gdb den bu şikayeti olsun. Program, bir giriş dizisinden mükemmel bir şekilde çalışır, böylece bu programın malloc çağrısı, programın diğer yürütmeleri sırasında açıkça başarılı olur. Ve tabii ki, var:

// 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)); 
+2

Malloc başarısız oluyorsa, en olası neden yığın bozulmasıdır. Programınızı valgrind altında çalıştırmayı denediniz mi? – JaredPar

+4

, 'adım' yerine 'sonraki' seçeneğini kullanın. Malloc'a adım atmaya çalışıyorsunuz ve gdb, malloc için kaynak koduna erişemediğinden şikayet ediyor. Gerçekten malloc'a girmek istemiyorsun. –

+0

Ah, teşekkürler, 'sonraki' düzeltildi. – Schemer

cevap

22

güvenle bu göz ardı edebilirsiniz:

#include <stdlib.h>. 

İşte kaynak kodudur. gdb, malloc'un kaynağına sahip olmadığından şikayet ediyor - ve kaynağından geçmek istemediğinizden neredeyse emin.

İki kolay çözümler: yerine adımın

  • Kullanım next - Zaten bir fonksiyonun içine yanlışlıkla step ed bıraktıysanız, Kaçacak finish kullanmak

  • o fonksiyonları iner olmaz işlevin dönüş ifadesi.

Ve alternatif yaklaşım:

  • Ayrıca oldukça bütün kodu atlama yerine, segfault önce biraz kırılabilir.

    • Sen (örneğin break foo.c:320 için foo.c hattı 320 üzerinde kırmaya) break <source file>:<line num> ile belirli bir hat üzerinde bir kesme noktası koyarak bunu yapabilirsiniz.
    • Veya belirli bir işlevi break <function name> ile kesebilirsiniz (örneğin break foo, foo() işlevinin üst kısmında bozulur).