Symbian: Kern-Exec 3 паники на RLibrary :: Загрузить - PullRequest
0 голосов
/ 27 октября 2010

У меня проблемы с динамической загрузкой библиотек - мой код паникует в 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__

У меня нет идей по этому поводу ... Любая помощь очень ценится.

PS Я пытаюсь сделать RLibrary:: Загрузка, потому что у меня проблемы со статической связью.Когда я делаю статическое связывание, моя основная программа вообще не запускается.Я решил проверить, что происходит, и обнаружил эту проблему с помощью RLibrary :: Load.

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Паника KERN-EXEC 3 вызвана необработанным исключением (сбой ЦП), возникающим из-за попытки недопустимого доступа к области памяти. Этот недопустимый доступ к памяти может быть как для кода (например, плохой ПК из-за повреждения стека), так и для данных (например, доступ к освобожденной памяти). Как таковые они обычно наблюдаются при разыменовании NULL-указателя (это эквивалентно segfault).

Конечно, вызов 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
0 голосов
/ 28 октября 2010

Случай, когда вы не можете использовать статическую связь, должен быть для вас серьезным предупреждением. Это показывает, что с вашей DLL что-то не так, и использование динамического связывания ничего не изменит.

Обычно в этих случаях проблема заключается в несовпадении возможностей. DLL должна иметь как минимум тот же набор возможностей, что и ваша основная программа. И все эти возможности должны быть подтверждены вашим сертификатом разработчика.

...