gpt4 book ai didi

linux - 如何将段错误指令指针地址从/var/log/messages 映射到我的.map 文件中的地址/函数?

转载 作者:太空狗 更新时间:2023-10-29 12:08:22 28 4
gpt4 key购买 nike

(我的环境是 64 位 Ubuntu,我的应用程序是 C++ 编译并与 g++ 链接。)

当应用程序执行类似除以零或运行 asm("int $3") 留在代码中的操作时,以下内容之一会通过 syslog 记录到 /var/log/kern.log/var/log/messages:

Sep 10 18:06:47 VM kernel: [117194.123452] a.out[20288] trap divide error ip:45c59d sp:7fff65a91810 error:0 in a.out[400000+144000]
Sep 10 18:07:10 VM kernel: [117217.020833] a.out[20294] trap int3 ip:45c493 sp:7fff5cc559f0 error:0

在这两种情况下,指令指针地址指向我可以在链接时生成的 .map 文件中轻松查找的内容(使用“-Wl,-Map,输出.map").

但是如果我导致段错误,在这种情况下是通过调用 memcpy() 并将源设置为 NULL,指令指针超出范围,我不知道它是怎么回事应该被映射:

Sep 10 18:06:13 VM kernel: [117160.228587] a.out[20282]: segfault at 0 ip 00007f7e79209092 sp 00007fff831faf08 error 4 in libc-2.9.so[7f7e79185000+168000]

在这个例子中,我预计 IP 在 0x445e70-0x445e7f 范围内,根据我的 .map 文件,这是 memcpy() 的位置。

我的问题:在这种情况下解释 ip 的技巧是什么?

最佳答案

根据消息,它看起来像是在 libc-2.9.so 中的 memcpy() 中崩溃,它映射到从 0x7f7e79185000 开始的进程。这是预期的,因为 memcpy 是试图取消引用指针的函数。指令指针看起来有效,因为它在 libc 的范围内。如果您打算覆盖 memcpy 并调用您自己的版本,则可能需要使用 -fno-builtin-memcpy 进行编译。

编辑:您可能正在静态链接 libc,但根据消息,您还将 libc 共享库映射到您的进程内存中。当您的程序运行时,您应该会在 /proc/pid/maps 中看到它。可能是你链接的是别的共享库,比如libstdc++,依赖libc共享库。因此,您有两个版本的 memcpy,在这种情况下,它正在调用映射到高地址的 libc 共享库版本。如果您不想要 libc 共享库,请确保您正在静态链接所有 库;在链接行的开头使用 -static 选项。

关于linux - 如何将段错误指令指针地址从/var/log/messages 映射到我的.map 文件中的地址/函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1408788/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com