【问题标题】:How to use mtrace for server如何在服务器上使用 mtrace
【发布时间】:2014-07-27 11:16:20
【问题描述】:

我在我的程序中成功使用了mtrace(),但它只创建了一个 16MB 的不可读文件,我阅读了here 来创建我应该使用的可读文件:

 mtrace ./myexe log

问题是我有一个需要一些参数的服务器,我也必须在上面运行一个应用程序,我尝试运行这个:

 mtrace "./Server args" log

但是如果打开服务器并等待应用程序,它只会输出一个未释放内存的列表。

所以我的问题是如何正确地将mtrace 用于服务器?

编辑:

用不可读的文件运行 mtrace 给我这个:

 mtrace "./Server args" log

很多这样的行:

- 0x0000000003941d40 Free 224404 was never alloc'd 0x2384d8b

还有这个:

Memory not freed:
-----------------
           Address     Size     Caller
0x00000000039600f0     0x48  at 0x238766c
0x00000000039739e0     0x38  at 0x37f0c0cbad
0x00007fc398000960     0x75  at 0x7fc3f3f0b2fd
0x00007fc3980009e0     0x30  at 0x7fc3f3f0b2fd
0x00007fc3c0001240     0x26  at 0x7fc3f3f0b2fd
0x00007fc3c00012a0     0x27  at 0x7fc3f3f0b2fd
0x00007fc3c0001ee0     0x29  at 0x7fc3f3f0b2fd
0x00007fc3c0001f20     0x2a  at 0x7fc3f3f0b2fd
0x00007fc3c0001f90     0x2a  at 0x7fc3f3f0b2fd
0x00007fc3c0001fd0     0x22  at 0x7fc3f3f0b2fd
0x00007fc3c0002030     0x2a  at 0x7fc3f3f0b2fd
0x00007fc3c00026c0     0x29  at 0x7fc3f3f0b2fd
0x00007fc3c0002700     0x22  at 0x7fc3f3f0b2fd
0x00007fc3c0002730     0x29  at 0x7fc3f3f0b2fd
0x00007fc3c00032d0     0x26  at 0x7fc3f3f0b2fd
0x00007fc3c00034d0     0x27  at 0x7fc3f3f0b2fd
0x00007fc3c00035b0     0x22  at 0x7fc3f3f0b2fd
0x00007fc3c00035e0     0x29  at 0x7fc3f3f0b2fd
0x00007fc3c00082b0      0x9  at 0x37f1081182
0x00007fc3c00084b0     0x28  at 0x7fc3f3f0b2fd
0x00007fc3c000a2f0      0xb  at 0x37f1081182
0x00007fc3c000a650     0x26  at 0x7fc3f3f0b2fd
0x00007fc3c000ac10     0x1e  at 0x7fc3f3f0b2fd
0x00007fc3c000af90      0xc  at 0x37f1081182
0x00007fc3c000b360     0x29  at 0x7fc3f3f0b2fd
0x00007fc3c000b870     0x38  at 0x7fc3f3f0b2fd
0x00007fc3c000ede0      0xc  at 0x37f1081182
0x00007fc3c00118a0     0x22  at 0x7fc3f3f0b2fd
0x00007fc3c0011f30     0x2c  at 0x7fc3f3f0b2fd
0x00007fc3c0011fd0     0x1e  at 0x7fc3f3f0b2fd
0x00007fc3c0012040     0x2a  at 0x7fc3f3f0b2fd
0x00007fc3c0012c30     0x40  at 0x7fc3f3f0b2fd
0x00007fc3c0014700      0xb  at 0x37f1081182
0x00007fc3c0014f10      0xb  at 0x37f1081182
0x00007fc3c0014fa0      0xb  at 0x37f1081182
0x00007fc3c00151d0     0x88  at 0x7fc3f7cc05c9
0x00007fc3c001d4b0     0x88  at 0x7fc3f7cc05c9
0x00007fc3c0024a00      0xb  at 0x37f1081182
0x00007fc3c003e960     0x40  at 0x7fc3f3f0b2fd
0x00007fc3c003edb0     0x88  at 0x7fc3f3f0b2fd
0x00007fc3c003ee40    0x170  at 0x37f0c118a3
0x00007fc3c003efc0     0x88  at 0x7fc3f3f0b2fd
0x00007fc3c003f050    0x170  at 0x37f0c118a3
0x00007fc3c003f1d0     0x88  at 0x7fc3f3f0b2fd
0x00007fc3c003f260    0x170  at 0x37f0c118a3
0x00007fc3c003f3e0     0x88  at 0x7fc3f3f0b2fd
0x00007fc3c003f470    0x170  at 0x37f0c118a3
0x00007fc3c003f5f0     0x88  at 0x7fc3f3f0b2fd
0x00007fc3c003f680    0x170  at 0x37f0c118a3
0x00007fc3c003f800     0x88  at 0x7fc3f3f0b2fd
0x00007fc3c003f890    0x170  at 0x37f0c118a3
0x00007fc3c0040890        0  at 0x7fc3efa7ee9d
0x00007fc3c00408b0      0x8  at 0x7fc3efa7ee9d
0x00007fc3c0040fc0    0x3f0  at 0x7fc3f3f0b2fd

【问题讨论】:

    标签: c++ linux mtrace


    【解决方案1】:

    我认为您误解了 mtrace 命令的使用。基于this,mtrace 似乎只是将日志文件转换为人类可读的东西。要首先创建日志文件,您需要运行应用程序。

    所以要创建一个日志文件,您首先将对mtrace()(c 函数)等的相关调用放入您的代码中,并在启用调试的情况下重新编译。接下来,您只需正常运行程序:

    ./Server args
    

    这会将任何内存问题写入日志文件,其名称由MALLOC_TRACE 环境变量设置。

    然后读取你运行的日志文件

    mtrace Server <logfilename>
    

    编辑:对于内存问题的一般调试,我建议改为研究 valgrind(当然,除非您已经了解 valgrind 并且有充分的理由不使用它来解决这种情况)。

    【讨论】:

    • 我照你说的做了,但它给了我一个我无法阅读的输出,请参阅编辑(因为它说我应该得到一个可读的文件,我认为这不是我想要的)
    • 我看到它应该可以工作,但我确实编译了我的可执行文件而没有优化和 -g,但我仍然得到不可读的文件。
    • 您运行的是mtrace "./Server args" log 还是mtrace ./Server log?我认为第二个是您需要使用的(它需要二进制文件来提取有关内存地址含义的信息,但它不需要命令行参数来做到这一点)。
    猜你喜欢
    • 2022-11-03
    • 2021-11-01
    • 1970-01-01
    • 2017-03-02
    • 2020-05-31
    • 2018-05-11
    • 2016-07-07
    • 2013-04-04
    • 2011-08-21
    相关资源
    最近更新 更多