LD_PRELOAD的使用--调试代码

前些天为了排查我们程序中不知道是库里面还是我们自己调用了assert断言,导致我们程序死亡。想通过hook拦截到调用这个函数的调用者,偶然间想起proload(预加载),小试牛刀使用如下代码

#include <syscall.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void abort(void)
{
    printf("****************my abort, getpid():%u\n", __FILE__, __LINE__, getpid());
    int *a = NULL;
    *a = 1;
    while(1)
    {
        sleep(10000);
    }
}


gcc --shared -fPIC preload.c -o libpreload.so 编译成so的形式


使用如下代码进行测试

#include <stdlib.h>
#include <stdio.h>
int main ( int argc, char *argv[] )
{
    printf("file:%s, line:%d, getpid():%u\n", __FILE__, __LINE__, getpid());
    abort();
    printf("file:%s, line:%d\n", __FILE__, __LINE__);
    void *p = malloc(3);
    return p == NULL;
    return EXIT_SUCCESS;
}

gcc testpreload.c -o testpreload 编译可执行程序,默认链接到了glibc中的assert


启动方式,

将libpreload.so放到和可执行程序testpreload同级目录下

LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" LD_PRELOAD="libpreload.so" ./testpreload


加入LD_LIBRARY_PATH 对当前目录的搜索,使用LD_PRELOAD 设定预加载的so,启动后输出如下结果

file:testpreload.c, line:31, getpid():9960
****************my abort, getpid():3086001460
./run.sh: line 1:  9960 段错误               LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" LD_PRELOAD="libpreload.so" ./testpreload


我故意产生了一个SIGV错误,暂时弄不清楚为什么getpid()的系统调用返回值不对,printf却可以运行无误。

主要用途:

可以代替ptrace拦截系统调用,或者对函数的调用,可以用来分析一些比如内存泄露(malloc free是否成对调用)等等问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 引用\[2\]和引用\[3\]中提到的问题是关于LD_PRELOAD的错误。LD_PRELOAD是一个环境变量,用于指定在程序加载时要预加载的共享库。在这种情况下,错误信息表明无法预加载libgomp.so.1共享库。这可能是由于库文件不存在或无法访问导致的。要解决这个问题,您可以尝试以下几个步骤: 1. 确保您的系统中存在libgomp.so.1库文件。您可以使用命令`find / -name libgomp.so.1`来查找该文件的位置。如果找不到该文件,您可能需要安装相应的软件包。 2. 检查文件权限。确保您对该文件具有读取权限。您可以使用命令`ls -l /path/to/libgomp.so.1`来查看文件权限,并使用`chmod`命令更改权限。 3. 检查LD_PRELOAD环境变量的设置。确保您正确设置了LD_PRELOAD环境变量,并且指定的共享库文件路径是正确的。 如果上述步骤都没有解决问题,您可能需要进一步调查错误的原因。您可以查看系统日志或尝试在其他平台上运行相同的程序以进行比较。希望这些信息对您有帮助。 #### 引用[.reference_title] - *1* *2* [【Mindspore产品】代码调试出现‘from LD_PRELOAD cannot be preloaded’](https://blog.csdn.net/weixin_45666880/article/details/126500108)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [使用asan查找程序内存泄露](https://blog.csdn.net/lishun1422840684/article/details/118728954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值