Symbian: kernel-exec 3 Panik auf Bibliothek :: Load
Frage
Ich habe Probleme mit dynamischem Laden von Bibliotheken - mein Code panics mit Kern-Exec 3. Der Code lautet wie folgt:
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();
Ich erhalte Panik auf TInt res = dll.Load(dllName, dllPath);
Was kann ich von dieser Panik zu tun bekommen zu befreien? mydll.dll ist wirklich meine dll, die nur 1 exportierte Funktion (für Testzwecke) hat. Vielleicht etwas mit dem DLL? Hier ist, was es ist:
def-Datei:
EXPORTS
_ZN4Init4InitEv @ 1 NONAME
pkg-Datei:
#{"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-Datei:
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
Quellcode:
// Exported Functions
namespace Init
{
EXPORT_C TInt Init()
{
// no implementation required
return 0;
}
}
Header-Datei:
#ifndef __MYDLL_H__
#define __MYDLL_H__
// Include Files
namespace Init
{
IMPORT_C TInt Init();
}
#endif // __MYDLL_H__
Ich habe keine Ideen dazu ... Jede Hilfe sehr geschätzt.
P. S. Ich versuche RLibrary :: Load zu tun, weil ich Probleme mit statischer Bindung habe. Wenn ich statische Verknüpfung tun, wird mein Hauptprogramm nicht starten. Ich beschloss, zu überprüfen, was passiert, und entdecken dieses Problem mit RLibrary :: Load.
Lösung
Der Fall, dass Sie nicht statisch Verknüpfung verwenden können, soll eine starke Warnung sein. Es zeigt, dass es etwas falsch mit Ihrem DLL und mit dynamischer Verknüpfung ändert nichts ist.
In der Regel ist in diesen Fällen das Problem in nicht übereinstimmen Fähigkeiten. DLL muss mindestens die gleiche Menge von Fähigkeiten, die Ihr Hauptprogramm hat. Und all diese Funktionen sollten von Ihrem Entwickler cert abgedeckt werden.
Andere Tipps
A KERN-EXEC 3 Panik wird durch eine nicht behandelte Ausnahme (CPU-Fehler) erzeugt, die durch einen Bereich des Speichers zu invalidly Zugriff versucht. Dieser ungültige Speicherzugriff kann sowohl Code sein (zum Beispiel schlecht PC durch Stapelbeschädigung) oder Daten (beispielsweise freigegebene Speicher zugreifen). Als solche werden diese typischerweise beobachtet, wenn ein NULL-Zeiger Dereferenzieren (es einen segfault äquivalent ist).
Sicherlich der Aufruf von RLibrary :: Load sollte nie ein KERN-EXEC 3 aufgrund programmatischer Fehler auslösen, ist es wahrscheinlich ein Umweltproblem sein. Als solche muss ich spekulieren, was geschieht.
Ich glaube, das Problem, das beobachtet wird, aufgrund Stapelüberlauf ist. Ihre MMP-Datei angeben nicht den Stapel oder Heap-Größe der anfängliche Thread verwenden soll. Als solche ist die Standardeinstellung von 4Kb (wenn ich mich richtig erinnere) verwendet. Ebenso TFileName Sie verwenden -. Verwendung dieses auf dem Stapel in der Regel nicht zu vermeiden empfohlen ... Stack-Überlauf
Sie wäre besser dran, die _LIT mit () Makro statt -. Dies ermöglicht es Ihnen, die RLibrary :: Load-Funktion mit einem Descriptor die konstanten Strings direkt zu liefern Referenzierung, wie in der konstanten Datenabschnitt des binären befindet
Als Randbemerkung, sollten Sie den Fehlerwert überprüfen den Erfolg des Funktionsaufrufes zu bestimmen.
_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