Symbian:对RLibrary :: Load的kern-exec 3恐慌

时间:2010-10-27 09:41:33

标签: dll load symbian panic

我有动态加载库的麻烦 - 我的代码恐慌与Kern-Exec 3.代码如下:

TFileName dllName = _L("mydll.dll");
TFileName dllPath = _L("c:\\sys\\bin\\");
RLibrary dll;
TInt res = dll.Load(dllName, dllPath); // Kern-Exec 3!
TLibraryFunction f = dll.Lookup(1);
if (f)
    f();

我对TInt res = dll.Load(dllName, dllPath);感到恐慌我能做些什么来消除这种恐慌? mydll.dll实际上是我的dll,它只有1个导出函数(用于测试目的)。也许这个DLL有问题?这就是它:

def文件:

EXPORTS
_ZN4Init4InitEv @ 1 NONAME

pkg文件:

#{"mydll DLL"},(0xED3F400D),1,0,0


;Localised Vendor name
%{"Vendor-EN"}

;Unique Vendor name
:"Vendor"

"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\mydll.dll"-"!:\sys\bin\mydll.dll"

mmp文件:

TARGET        mydll.dll
TARGETTYPE    dll
UID          0x1000008d 0xED3F400D

USERINCLUDE  ..\inc
SYSTEMINCLUDE   \epoc32\include

SOURCEPATH    ..\src

SOURCE        mydllDllMain.cpp
LIBRARY      euser.lib

#ifdef ENABLE_ABIV2_MODE
DEBUGGABLE_UDEBONLY
#endif

EPOCALLOWDLLDATA

CAPABILITY CommDD LocalServices Location MultimediaDD NetworkControl NetworkServices PowerMgmt ProtServ ReadDeviceData ReadUserData SurroundingsDD SwEvent TrustedUI UserEnvironment WriteDeviceData WriteUserData

源代码:

//  Exported Functions
namespace Init
    {
    EXPORT_C TInt Init()
        {
        // no implementation required
        return 0;
        }
    }

头文件:

#ifndef __MYDLL_H__
#define __MYDLL_H__

//  Include Files

namespace Init
{
    IMPORT_C TInt Init();
}

#endif  // __MYDLL_H__

我对此没有任何想法...非常感谢任何帮助。

P.S。我正在尝试做RLibrary :: Load因为我有静态链接的麻烦。当我进行静态链接时,我的主程序根本没有启动。我决定检查发生了什么,并用RLibrary :: Load发现了这个问题。

2 个答案:

答案 0 :(得分:1)

KERN-EXEC 3恐慌是由于尝试无效访问内存区域而产生的未处理异常(CPU故障)引起的。这种无效的内存访问可以用于代码(例如,堆栈损坏的坏PC)或数据(例如,访问释放的内存)。因此,这些通常在取消引用NULL指针时会被观察到(它相当于段错误)。

当然,由于程序错误,对RLibrary :: Load的调用永远不应该提出KERN-EXEC 3,这可能是一个环境问题。因此,我必须推测正在发生的事情。

我认为观察到的问题是由于堆栈溢出。您的MMP文件未指定初始线程应使用的堆栈或堆大小。因此,将使用4Kb的默认值(如果我没记错的话)。同样,您正在使用TFileName - 通常不建议在堆栈上使用这些来避免堆栈溢出。

您最好使用_LIT()宏 - 这将允许您为RLibrary :: Load函数提供一个描述符,该描述符直接引用位于二进制文件的常量数据部分中的常量字符串。

作为旁注,您应该检查错误值以确定函数调用是否成功。

_LIT(KMyDllName, "mydll.dll");
_LIT(KMyDllPath, "c:\\sys\\bin\\");
RLibrary dll;
TInt res = dll.Load(KMyDllName, MyDllPath); // Hopefully no Kern-Exec 3!
if(err == KErrNone)
    {
    TLibraryFunction f = dll.Lookup(1);
    if (f)
        f();
    }
// else handle error

答案 1 :(得分:0)

您不能使用静态链接的情况应该是对您的强烈警告。它表明您的DLL出现了问题,使用动态链接不会改变任何内容。

通常在这些情况下,问题在于功能不匹配。 DLL必须至少具有与主程序相同的功能集。所有这些功能都应该由您的开发人员证书涵盖。