代码之家  ›  专栏  ›  技术社区  ›  Gerald Chu

AIX:_snw中的malloc(无符号长)?

  •  1
  • Gerald Chu  · 技术社区  · 10 年前

    我试图在AIX的测试程序中跟踪malloc分配。因此,我用调用旧系统malloc的new_malloc替换了malloc,然后使用对系统的调用打印出调用堆栈(“procstack-pid”)。奇怪的是,在一些电话中,我听到了这样的声音:

    0x09000000000ae23c  waitpid(??, ??, ??) + 0x190
    0x090000000018d8e0  system(??) + 0x1fc
    0x0000000100011a34  PrintCallStack__()() + 0x34
    0x000000010000167c  malloc(0x80) + 0x3c
    0x0000000100011acc  __snw(unsigned long)(0x80) + 0x4c
    0x0000000100011eac  __svn(unsigned long)(0x80) + 0x4c
    0x000000010000ac84  main(0x100000001, 0xffffffffffff568) + 0xc4
    0x00000001000002d8  __start() + 0x98
    

    __snw(unsigned long)和__svn(unsignedlong)调用来自什么,它们调用malloc(意外)?它们似乎发生在malloc之后,但在printf之前。

    我的测试代码:

    char* y = (char*) malloc(128);
    memset(y, 0, 128);
    memset(y, 'Z', 15);
    printf("y=%s %p\n", y, y);
    free(y);
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   pedz    10 年前

    这并不能回答这个问题,但它确实(我希望)教授了一些技巧。

    我做到了:

    ls /usr/lib/*.a | while read lib ; do echo $lib ; nm $lib 2>/dev/null| egrep '__svn|__snw' ; done
    

    它向我展示了这些来自libC.a.,然后我做到了:

    mkdir /tmp/dog
    cd /tmp/dog
    ar x /usr/lib/libC.a
    for i in * ; do echo $i ; nm $i 2> /dev/null | egrep '__svn|__snw' ; done
    

    这表明它来自ansicore32.o

    lslpp -w /usr/lib/libC.a
    

    告诉我它来自xlC.rte,它来自编译器人员。

    所以……没有直接回答你的问题,但这似乎与C++有关。用C程序运行测试会很奇怪。C++有各种奇怪之处,它调用malloc并不奇怪。我仍然对以前的问题感到困惑。如果您有一个名为new_malloc的东西,为什么预编译实体会开始使用它?

    最后,关于更大的问题,AIX的malloc有很多功能。它们不一定是我推荐的。我是一个内核空间的人,而不是应用程序空间类型的人。我用得越少,我就越沮丧。但这里有一个IBM酒吧的链接: 6.1 AIX Pubs 搜索“mallocdebug”和“mallcoptions”,您将找到可以使用的各种功能。我记得,有3种不同的malloc算法可供选择,还有多种调试选项。

    IBM也有 Purify 。我从未使用过它(我是内核级别的),但我非常尊敬的一个应用程序人喜欢它。

    最后,AIX具有通常称为“内核跟踪”的跟踪功能,但它们也可以在应用程序空间中使用。这些是迄今为止使用的侵入性最小的技术。通过一点精心制作,您可以在对运行代码几乎没有影响的情况下关闭它们,但您仍然可以打开它们(例如,当用户遇到只有他才能重新创建的问题时,在现场)。要开始,去酒吧(上图)搜索trchook/etc/trcfmt还有很多其他地方没有记录的信息。

    祝你好运