代码之家  ›  专栏  ›  技术社区  ›  secmask

Sigsegv回溯

  •  6
  • secmask  · 技术社区  · 14 年前

    我正在调试一个用ANSIC(多线程程序)编写的应用程序。
    有时,在主线程中会导致SIGSEGV故障。

    (gdb) backtrace full
    #0  0x0000000000000000 in ?? ()
    No symbol table info available.
    #1  0x0000000000000000 in ?? ()
    No symbol table info available.
    (gdb) info registers
    rax            0x1      1
    rbx            0x0      0
    rcx            0x0      0
    rdx            0x2      2
    rsi            0x458e7aa0       1166965408
    rdi            0x0      0
    rbp            0x0      0x0
    rsp            0x458e7b60       0x458e7b60
    r8             0x458e7b20       1166965536
    r9             0x0      0
    r10            0x0      0
    r11            0x206    518
    r12            0x2aaaac400e70   46912522686064
    r13            0x2aaaac514090   46912523813008
    r14            0x1      1
    r15            0x18505f10       407920400
    rip            0x0      0
    eflags         0x10206  [ PF IF RF ]
    cs             0x33     51
    ss             0x2b     43
    ds             0x0      0
    es             0x0      0
    fs             0x63     99
    gs             0x0      0
    fctrl          0x37f    895
    fstat          0x0      0
    ftag           0xffff   65535
    fiseg          0x0      0
    fioff          0x0      0
    foseg          0x0      0
    fooff          0x0      0
    fop            0x0      0
    mxcsr          0x1f80   [ IM DM ZM OM UM PM ]
    (gdb)
    

    这些信息来自核心文件,我不太熟悉Linux环境中的调试,我能做些什么来找出问题所在吗?

    编辑 :所有源文件都使用以下标志编译

    gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/redisconnector.d" -MT"src/redisconnector.d" -o"src/redisconnector.o" "../src/redisconnector.c"
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   osgx    14 年前

    使用“-g”选项重新编译应用程序;

    不将gdb用于核心文件,而是用于运行整个应用程序:

    gdb --args ./application application_options
    

    然后执行gdb的“run”命令。

    从gdb运行将检测sigsegv,gdb将关注失败的线程。

        2
  •  3
  •   ninjalj    14 年前

    你的翻录指向0。它可能是由堆栈溢出引起的。你的RBP也是0,所以 backtrace gdb命令不会告诉您任何信息。

        3
  •  1
  •   OmnipotentEntity    14 年前

    首先,您需要在启用调试的情况下进行编译,以便您的回溯有一些可用的东西。旗子是gcc-g

    推荐文章