linux利用gdb从coredump中搜索对象的个数

linux利用gdb从coredump中搜索对象的个数

在定位内存占用问题的时候,通常我们会想要寻找某一类对象的个数,比如XXXRequest到底在内存中有多少,有没有泄露这类问题。

通常手段有以下两种

  • 加监控,通过定期的输出或采集监控信息来获取对象的个数。需要重新编译启动程序
  • 一些运行在VM上语言,如java、js,可以通过堆dump或字节码注入的方式获取对象在VM中的个数,无需重启程序。可是如果涉及到直接操作OS的内存,如java的直接内存占用,就无法通过这种方式获取对象个数了

这里想介绍的方式是,我们还可以通过gdb对程序进行coredump,在二进制文件中过滤的特征值方式来查找消息的个数。一般某一类对象或多或少都有一些独特的字符串,比如用户Id、订单Id等

我们以pulsar中的消息为例,demo程序如下

 public static void main(String[] args) throws Exception {
        Configurator.setRootLevel(Level.INFO);
        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:8080").build();
        Producer producer = client.newProducer().topic("test-topic").create();
        RateLimiter rateLimiter = RateLimiter.create(20);
        while (true) {
            rateLimiter.acquire(1);
            producer.sendAsync("my-message-trait".getBytes(StandardCharsets.UTF_8));
        }
    }

使用gdb挂载程序

sudo gdb -p $pid
(gdb) generate-core-file
(gdb) quit

core.$pid文件默认会生成在当前用户的home路径下,然后就可以使用grep语句根据特征值来查找对象的个数

grep -a "my-message-trait" core.$pid |wc -l
> 121

你可能感兴趣的:(linux利用gdb从coredump中搜索对象的个数)