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]范围内堆栈跟踪中的所有符号)不显示有两个可能的原因(我可以想到)
尽管@user794080没有这样说,但他的程序极有可能是一个32位linux可执行文件 主可执行文件中的符号(以及[0x08040000,0x08100000]范围内堆栈跟踪中的所有符号)不显示有两个可能的原因(我可以想到)
堆栈可能已损坏。如果堆栈上的返回地址已被缓冲区溢出等覆盖,则可能会发生“?”。堆栈可能已损坏。“?”如果堆栈上的返回地址被缓冲区溢出等覆盖,则可能发生这种情况。标记为“”的字段不是来自已使用-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可以来自主库和静态库,但它们足够远了。