Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 地址范围映射_C_Debugging_Gdb_Coredump - Fatal编程技术网

C 地址范围映射

C 地址范围映射,c,debugging,gdb,coredump,C,Debugging,Gdb,Coredump,我正在分析这个核心转储 Program received signal SIGABRT, Aborted. 0xb7fff424 in __kernel_vsyscall () (gdb) where #0 0xb7fff424 in __kernel_vsyscall () #1 0x0050cd71 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #2 0x005

我正在分析这个核心转储

   Program received signal SIGABRT, Aborted.
    0xb7fff424 in __kernel_vsyscall ()
    (gdb) where
    #0  0xb7fff424 in __kernel_vsyscall ()
    #1  0x0050cd71 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
    #2  0x0050e64a in abort () at abort.c:92
    #3  0x08083b3b in ?? ()
    #4  0x08095461 in ?? ()
    #5  0x0808bdea in ?? ()
    #6  0x0808c4e2 in ?? ()
    #7  0x080b683b in ?? ()
    #8  0x0805d845 in ?? ()
    #9  0x08083eb6 in ?? ()
    #10 0x08061402 in ?? ()
    #11 0x004f8cc6 in __libc_start_main (main=0x805f390, argc=15, ubp_av=0xbfffef64, init=0x825e220, fini=0x825e210, 
        rtld_fini=0x4cb220 <_dl_fini>, stack_end=0xbfffef5c) at libc-start.c:226
    #12 0x0804e5d1 in ?? ()
程序收到信号SIGABRT,中止。
内核vsyscall()中的0xb7fff424
(gdb)在哪里
#内核vsyscall()中的0 0xb7fff424
#1 0x0050cd71在../nptl/sysdeps/unix/sysv/linux/raise.c:64处的raise(sig=6)中
#2 0x0050e64a在中止中()在中止处。c:92
#3 0x08083b3b英寸??()
#4 0x08095461英寸??()
#5 0x0808bdea英寸??()
#6 0x0808c4e2英寸??()
#7 0x080b683b英寸??()
#8 0x0805d845英寸??()
#9 0x08083eb6英寸??()
#10 0x08061402英寸??()
#11 0x004f8cc6在“启动”主管道中(主管道=0x805f390,argc=15,ubp\U av=0xbfffef64,初始管道=0x825e220,终管道=0x825e210,
libc开始时的rtld_fini=0x4cb220,stack_end=0xbffef5c)。c:226
#12 0x0804e5d1英寸??()
我不知道哪个函数
映射到或例如
#10 0x08061402 in??()
落在哪个地址范围内


请帮我调试。

您的程序没有调试符号。用
-g
重新编译它。确保没有剥离可执行文件,例如,将
-s
传递到链接器。

您的程序没有调试符号。用
-g
重新编译它。确保没有剥离可执行文件,例如,将
-s
传递给链接器。

要知道哪些库映射到应用程序中,请记录程序的pid,在gdb中停止,并在其他控制台中运行

cat /proc/$pid/maps
wher$pid是已停止进程的pid。映射文件的格式在-从“/proc/[number]/maps开始描述 包含当前映射的内存区域及其访问权限的文件。“

此外,如果您的操作系统未使用ASLR(地址空间布局随机化)或您的程序已禁用ASLR,则可以使用

ldd ./program

列出链接库及其内存范围。但如果ASLR被打开,您将无法获得真正的内存映射范围信息,因为它会随着程序的每次运行而改变。但即使这样,您也会知道哪些库是动态链接的,并为它们安装debuginfo。

要知道哪些库映射到应用程序中,请记录程序的pid,在gdb中停止并在其他控制台中运行

cat /proc/$pid/maps
wher$pid是已停止进程的pid。映射文件的格式在-从“/proc/[number]/maps开始描述 包含当前映射的内存区域及其访问权限的文件。“

此外,如果您的操作系统未使用ASLR(地址空间布局随机化)或您的程序已禁用ASLR,则可以使用

ldd ./program

列出链接库及其内存范围。但如果ASLR被打开,您将无法获得真正的内存映射范围信息,因为它会随着程序的每次运行而改变。但即使这样,您也会知道哪些库是动态链接的,并为它们安装debuginfo。

尽管@user794080没有这样说,但他的程序很可能是32位linux可执行文件

主可执行文件中的符号(以及[0x08040000,0x08100000]范围内堆栈跟踪中的所有符号)不显示有两个可能的原因(我可以想到)

  • 实际上,主可执行文件已被剥离(这与 ninjalj的答案),并且经常发生在将“-s”传递到链接器时,可能是无意中
  • 可执行文件已经用一个新的(er)GCC编译,但是正在由一个旧的(er)GDB调试,它阻塞了一些新的dwarf构造(GDB应该对此发出警告)

  • 尽管@user794080没有这样说,但他的程序极有可能是一个32位linux可执行文件

    主可执行文件中的符号(以及[0x08040000,0x08100000]范围内堆栈跟踪中的所有符号)不显示有两个可能的原因(我可以想到)

  • 实际上,主可执行文件已被剥离(这与 ninjalj的答案),并且经常发生在将“-s”传递到链接器时,可能是无意中
  • 可执行文件已经用一个新的(er)GCC编译,但是正在由一个旧的(er)GDB调试,它阻塞了一些新的dwarf构造(GDB应该对此发出警告)

  • 堆栈可能已损坏。如果堆栈上的返回地址已被缓冲区溢出等覆盖,则可能会发生“?”。

    堆栈可能已损坏。“?”如果堆栈上的返回地址被缓冲区溢出等覆盖,则可能发生这种情况。

    标记为“”的字段不是来自已使用-g编译的程序:这些符号来自共享库///我想知道哪一个以便安装debuginfo@user794080:然后是程序中的一个库正在使用的缺少调试符号。@用户:否,它们来自您的程序。标记为“”的字段不是来自已使用-g编译的程序:这些符号来自共享库///我想知道哪一个?以便安装debuginfo@user794080:则您的程序正在使用的库之一缺少其debugging符号。@用户:不,它们来自您的程序。0x08xxx是可执行文件。0x004xxx是库。我想OP没有运行exec shield或PAX。它也可以是一个静态库。啊,是的,虽然我不希望直接调用它。9:0x0808383eb6和10:0x08061402可以来自主库和静态库,但它们远远不够够了。0x08xxx是可执行文件。0x004xxx是库。我想OP没有运行exec shield或PAX。它也可以是一个静态库。啊,是的,虽然我不希望
    \u libc\u start\u main
    直接调用它。9:0x08083eb6和10:0x08061402可以来自主库和静态库,但它们足够远了。