Forum: PC-Programmierung Access Violation in Win CE 6.0 R3 Dll-Projekt


von JoW (Gast)


Lesenswert?

Mahlzeit!

Ich habe folgendes Problem: Ich habe auf einem XP System eine DLL 
Projekt erstellt, welches dort erfolgreich in einer Applikation 
verwendet wird. Nun habe ich diees DLL Projekt auf mein Win CE 6.0 R3 
portiert. Alles ging ohne Probleme kompilieren. Lass ich den Code 
laufen, so wirft exakt eine bestimmte Member-Methode einer Klasse ein 
Access Violation, sobald ich innerhalb dieser Methode eine externe 
Funktion oder eine andere Member-Methode aufrufe. Das Deklarieren und 
Initialisieren von lokalen Variablen und der Zugriff auf 
Member-Variablen funktioniert.

Selbst ein simples "printf("Hallo Welt!\n")" innerhalb dieser 
Member-Methode wirft eine Access Violation in "coredll.dll". Rufe ich 
eine Member-Methode auf, so führt meine DLL zu dieser Access Violation.

Woran kann dies liegen? Hat jemand einen guten Tip?

Vielen Dank!

Grüße, JoW

von JoW (Gast)


Lesenswert?

Edit: Das Dll Projekt wurde als Subproject im Platform Builder angelegt. 
Also kein Exportieren und Einbinden eines bestimmten SDKs notwendig.

von Peter II (Gast)


Lesenswert?

hast du eventuell Debug und Release gemischt?

von JoW (Gast)


Lesenswert?

Hi!

Also die Dateien werden in "obj\...\retail" erstellt und dann in das 
Release-Verzeichnis unter "...\retail" kopiert, worauf dann das MakeImg 
ausgeführt wird.

Global habe ich Release eingestellt. Das wird dann doch für das 
Subproject übernommen, oder?

Grüße, JoW

von Peter II (Gast)


Lesenswert?

JoW schrieb:
> Also die Dateien werden in "obj\...\retail" erstellt und dann in das
> Release-Verzeichnis unter "...\retail" kopiert, worauf dann das MakeImg
> ausgeführt wird.

dann sollte das passen.

Warum debugs du die Stelle nicht einfach mal? Dann sieht man doch worauf 
er zugreifen will.

von JoW (Gast)


Lesenswert?

Ja, das ist ein wenig ein Problem. Ich hab erstens kein zuverlässiges 
Debug-Image. Außerdem müsste ich dieses auf Grund der Größe und des 
begrenzten RAMs meiner Zielhardware jedes mal bei einer Änderung in den 
Flash schreiben. Dies dauert ca. 30-40 Minuten. Davon möchte ich als 
eher absehen. Klingt doof, aber geht halt nicht.

Ich kann aber mit dem KITL auch im Release durch den Code-Steppen, die 
Sprungweite stimmt dann zwar nicht immer - er springt manchmal in eine 
if, obwohl er dies nicht tut - aber man kann sehen, wo es hängt.

Dabei habe ich eben festgestellt, dass alle anderen Methoden der Klasse, 
die bis zu der Zugriffsverletzung aufgerufen werden, erfolgreich 
terminieren. Erst in dieser einen Methode tritt, egal was man macht - 
Aufrufen einer Member-Methode oder einer externen Funktion wie 
prinft(..) - die Zugriffsverletzung ein.

Greets, JoW

von Peter II (Gast)


Lesenswert?

JoW schrieb:
> Ich kann aber mit dem KITL auch im Release durch den Code-Steppen, die
> Sprungweite stimmt dann zwar nicht immer - er springt manchmal in eine
> if, obwohl er dies nicht tut - aber man kann sehen, wo es hängt.

dann must du einfach mal auf ASM umschalten und schauen was da genau 
passiert.

von JoW (Gast)


Lesenswert?

Das habe ich noch nie im Platform Builder gemacht. Wie funktioniert das? 
Er unterbricht ja das Steppen, sobald ich an einer dieser Fehlerstellen 
weiterlaufe.

Danke!

von Peter II (Gast)


Lesenswert?

JoW schrieb:
> Das habe ich noch nie im Platform Builder gemacht. Wie funktioniert das?

keine Ahnung wie es dort genau geht, aber bei den anderne IDEs von MS 
kann man einfach per Rechte maustaste auf ASM umschalten und dann dort 
im einzelschritt steppen.

von JoW (Gast)


Lesenswert?

Das hier spuckt mir das Debug-Fenster im Visual Studio aus:

72246 PID:41b000a TID:528000a Exception 'Data Abort' (4): Thread-
       Id=0528000a(pth=895e29c0), Proc-Id=041b000a(pprc=8952b364)
      'MeineTestExe.EXE', VM-active=041b000a(pprc=8952b364)
      'MeineTestExe.EXE'

72246 PID:41b000a TID:528000a PC=40051544(coredll.dll+0x00041544)
        RA=4091ef18(MeineDLL.dll+0x0001ef18) SP=001ffdec, BVA=001ffddc

von JoW (Gast)


Lesenswert?

Und an der letzten Zeile wirft die coredll.dll die Access Violation, 
wenn ich als erste aufgerufene Funktion an dieser Stelle ein 
printf("...\n") einfüge. Was sagt mir dies nun?

printf:
40051540    mov         r12, sp
40051544    stmdb       sp!, {r0 - r3}

Danke für Rat und Tat!

von Peter II (Gast)


Lesenswert?

JoW schrieb:
> Was sagt mir dies nun?
>
> printf:
> 40051540    mov         r12, sp
> 40051544    stmdb       sp!, {r0 - r3}

dafür müsste man etwas mehr wissen, was steht in Rl2, was steht in sp, 
was steht in R0 oder R3.

dann muss man auch etwas mehr vom ASM sehen.

von JoW (Gast)


Lesenswert?

Ich werde mich mal mit dem ASM Code auseinandersetzen.

Woran könnte es denn grundsätzlich liegen, dass exakt eine 
Member-Methode keinerlei externe Funktionen oder andere Member-Methoden 
aurufen kann?

Viele Grüße, JoW

von Peter II (Gast)


Lesenswert?

eigentlich nur wenn der "this" zeiger unsinn ist. Dann geht der Zugriff 
auf die Members der Klasse schief. Oder der Fehler ist schon vorher 
passiert (z.b. es wurde speicher überschrieben) und wirkt sich erst beim 
nächsten zugriff auf dem Stack aus.

"Access Violation" ist halt ein ungültiger speicherzugriff, dafür müsste 
man erstmal wissen warauf er zugreifen wollte.

von JoW (Gast)


Lesenswert?

Nützt es evtl. wenn ich mir den this-Pointer im Konstruktor mal ausgeben 
lasse und später direkt zu Beginn der "fehlerhaften" Methode?

Grüße, JoW

von Peter II (Gast)


Lesenswert?

JoW schrieb:
> Nützt es evtl. wenn ich mir den this-Pointer im Konstruktor mal ausgeben
> lasse und später direkt zu Beginn der "fehlerhaften" Methode?

schaden tut es auf jeden fall nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.