Linux Debugging(六): 动态库注入、ltrace、strace、Valgrind

本文介绍了Linux系统下四个强大的调试工具:动态库注入、ltrace、strace和Valgrind。动态库注入用于快速定位调用者问题,ltrace跟踪库函数调用,strace关注系统调用,而Valgrind则是一个包含多种工具的内存调试和性能分析平台,如Memcheck、Callgrind等。
摘要由CSDN通过智能技术生成

实际上,Linux的调试方法非常多,针对不同的问题,不同的场景,不同的应用,都有不同的方法。很难去概括。本篇文章主要涉及本专栏还没有涵盖,但是的确有很重要的方法。本文主要包括动态库注入调试;使用ltrace命令处理动态库的调试;使用strace调试系统调用的问题;Valgrind的简要介绍。

1. 动态库注入

      如何排除其他library的调用问题?动态库注入(library injection)有可能会让你事半功倍。

一个大型的软件系统,会用到非常多的动态库。那么如果该动态库的一个api调用出了问题,而调用该api的地方非常非常多,不同的调用都分散的记录在不同的log里。那么,如何快速的找到是哪个调用者出的问题? 当然我们可以通过动态库注入的方式去调试。

     下面的代码hook了两个常见的函数memcpy和socket:

void _init(void)
{
  mtrace();
  printf("HOOKing: hello\n");
}

void _fini(void)
{
  printf("HOOKing: goodbye\n");
}

typedef void* (*real_memcpy)(void*, const void*, size_t);
void *memcpy( void *dest, const void*src, size_t size)
{
  real_memcpy real = dlsym((void*)-1, "memcpy");
  printf("Coping from %p to %p, size %d\n", src,dest,size);

  return real(dest, src, size);
}
typedef int (*real_socket)(int socket_family, int socket_type, int protocol);

int socket(int socket_family, int socket_type, int protocol)
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值