IOService泄漏没有任何理由

时间:2013-10-14 03:36:20

标签: c++ macos memory-leaks iokit kernel-extension

好吧,我完全被难过和沮丧。我正在开发一个I / O Kit RAM Disk实现,并发现当我的朋友用kextload加载它时它没有卸载,然后尝试用kextunload卸载它。原因是没有任何分配了kext的OSObject s被释放。但是,在我的计算机(运行Mac OS 10.8.5)和VM(运行Mac OS 10.7)上,一切都按预期工作。

最终,我把问题缩小了很多,以至于我创建了一个带有空白I / O Kit驱动程序的新Xcode项目,并在我朋友的机器上进行了测试。瞧,我无法用kextunload卸载模块,因为它声称我的IOService子类正在泄漏。我想在我朋友的机器上测试另一个驱动程序,我不会覆盖任何IOService方法(在我测试的版本中,我在将调用传递给{{{{}}之前覆盖了一些操作IOLog 1}})。我将使用我收集的有关其机器配置的任何额外信息来更新此信息。

这是我的标题(BrokenDriver.h):

super

这是我的实现(BrokenDriver.cpp):

#include <IOKit/IOService.h>
#include <IOKit/IOLib.h>

class BrokenDriver : IOService {
    OSDeclareDefaultStructors(BrokenDriver)
public:
    virtual bool init(OSDictionary * dictionary = NULL);
    virtual void free();

    virtual bool start(IOService * provider);
    virtual void stop(IOService * provider);
};

此外,因为我知道这可能是问题的根源,所以这是我的BrokenDriver-Info.plist的XML:

#define super IOService
OSDefineMetaClassAndStructors(BrokenDriver, IOService);

bool BrokenDriver::start(IOService * provider) {
    bool success;
    IOLog("%s[%p]::%s(%p)\n", getName(), this, __FUNCTION__, provider);
    success = super::start(provider);
    if (success) {
        // Don't worry, the problem persists even if I don't call registerService()
        registerService();
    }
    return success;
}

void BrokenDriver::stop(IOService * provider) {
    IOLog("%s[%p]::%s(%p)\n", getName(), this, __FUNCTION__, provider);    
    super::stop(provider);
}

bool BrokenDriver::init(OSDictionary * dictionary) {
    if (!super::init(dictionary)) {
        return false;
    }    
    IOLog("%s[%p]::%s(%p)\n", getName(), this, __FUNCTION__, dictionary);
    return true;
}

void BrokenDriver::free(void) {
    IOLog("%s[%p]::%s()\n", getName(), this, __FUNCTION__);
    super::free();
}

那么,判决是什么?我朋友的内核是炒的,还是我的大脑?甚至远程可能他的机器上的其他驱动程序试图保留我的kext吗?

更新:我再次尝试使用EMPTY实施。没错,我完全超过了我自己的0种方法。问题依然存在。以下是来自<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleExecutable</key> <string>${EXECUTABLE_NAME}</string> <key>CFBundleIconFile</key> <string></string> <key>CFBundleIdentifier</key> <string>com.aqnichol.${PRODUCT_NAME:rfc1034identifier}</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>${PRODUCT_NAME}</string> <key>CFBundlePackageType</key> <string>KEXT</string> <key>CFBundleShortVersionString</key> <string>1.0</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> <string>1</string> <key>NSHumanReadableCopyright</key> <string>Copyright © 2013 Alex Nichol. All rights reserved.</string> <key>IOKitPersonalities</key> <dict> <key>BrokenDriver</key> <dict> <key>CFBundleIdentifier</key> <string>com.aqnichol.BrokenDriver</string> <key>IOClass</key> <string>BrokenDriver</string> <key>IOKitDebug</key> <integer>65535</integer> <key>IOMatchCategory</key> <string>BrokenDriver</string> <key>IOProbeScore</key> <integer>1000</integer> <key>IOProviderClass</key> <string>IOResources</string> <key>IOResourceMatch</key> <string>IOKit</string> </dict> </dict> <key>OSBundleLibraries</key> <dict> <key>com.apple.kpi.iokit</key> <string>9.0.0</string> <key>com.apple.kpi.libkern</key> <string>9.0.0</string> <key>com.apple.kpi.mach</key> <string>9.0.0</string> </dict> </dict> </plist> 的消息:

kextunload

1 个答案:

答案 0 :(得分:0)

我不知道这是否是问题,但我注意到IOService是您班级的私人基础。我可以想象这可能会在Apple的运行时类型信息宏中引发一些微妙的问题吗?

尝试:

class BrokenDriver : public IOService