IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:Assertion

共 1 篇相关文章

IT 累计浏览 1,941

如何hook一个系统调用

这篇讲的是如何通过hook系统调用来定位一个隐蔽的bug。作者从一个具体问题出发:他们使用的某个库会断言socket的文件描述符必须大于0,但系统运行一段时间后这个断言会失败,意味着有人错误地关闭了标准输入(fd=0)。 面对这个难题,作者没有选择在每个close调用处手动添加日志(工作量大且易遗漏),而是利用了Linux下动态链接的一个精妙特性:`LD_PRELOAD`。文章详细展示了如何编写一个名为`my_close.c`的共享库,在其中重新定义`close`函数。这个函数会先检查传入的fd是否为0,如果是则直接让程序崩溃(coredump),否则通过`dlsym`获取并调用原始的`close`函数。 通过设置`LD_PRELOAD`环境变量指向这个自定义库,程序在运行时就会优先加载它,从而劫持所有的`close`调用。这样,一旦程序中有代码试图关闭标准输入,就能立刻被定位到。整个过程巧妙地利用了系统机制,将原本需要大范围排查的问题,转化为了一个精准的触发点,是调试动态库和大型程序时一个非常实用的技巧。