Seite 1 von 1

Wie IMA-Problem durch Pseudotype finden?

Verfasst: 03.12.2015 22:29
von Regenduft
Hallo miteinander,

lange nicht mehr gepostet. :)

Ich spiele gerade mit der VLC-Library herum und habe extreme Probleme einen Bug zu isolieren, der einen ungültigen Speicherzugriff auslöst. Mir ist soweit klar, dass es sich um ein Problem mit der Verwendung von Pseudotypes in Prototypes handelt bei x86-Kompilat. Ich stehe irgendwo auf der Leitung...

Folgender Code-Ausschnitt macht KEINE Probleme, wenn ich eine Exe als "Unicode x64", "Ascii x64" oder "Ascii x86" kompiliere. Wenn ich aber als "Unicode x86" kompiliere dann erhalte ich immer einen illegalen Speicherzugriff an einer scheinbar absolut zufälligen Adresse:

Code: Alles auswählen

Prototype.i libvlc_media_new_path(instance, path.p-ascii) ; <-- hier ist der problematische Pseudotype
Global libvlc_media_new_path.libvlc_media_new_path 

;(...)

libvlc_media_new_path = GetFunction(#VLC_DLL, "libvlc_media_new_path")

;(...)

; Hier kommt der IMA!
media = libvlc_media_new_path(instanz, "C:\Users\blabliblub\Downloads\Downloader\Deichkind - Like Mich Am Arsch (Official Video)\Deichkind - Like Mich Am Arsch (Official Video) (1080p).mp4")
Und nun der Witz: Wenn ich mit einem eigenen "Pseudo-Pseudotype" herumpfusche, dann läuft alles einwandfrei...

Code: Alles auswählen

; Mein eigener "Pseudo-Pseudotype" ;)
Procedure.s PseudoAscii( String$ )
  CompilerIf #PB_Compiler_Unicode
    PokeS(@String$, PeekS(@String$), -1, #PB_Ascii)
  CompilerEndIf
  ProcedureReturn String$
EndProcedure

;(...)

Prototype.i libvlc_media_new_path(instance, path$) ; <-- diesmal "normaler" String statt Pseutotype
Global libvlc_media_new_path.libvlc_media_new_path 

;(...)

libvlc_media_new_path = GetFunction(#VLC_DLL, "libvlc_media_new_path")

;(...)

; Diesmal KEIN IMA... trotz "Stringgepfusche"... :/
media = libvlc_media_new_path(instanz, PseudoAscii("C:\Users\blabliblub\Downloads\Downloader\Deichkind - Like Mich Am Arsch (Official Video)\Deichkind - Like Mich Am Arsch (Official Video) (1080p).mp4"))
Hat jemand eine Idee in welche Richtung ich suchen kann um den Bug weiter einzukreisen?
Es scheint auch kein PureBasic-Bug zu sein, denn wenn ich den Prototypeaufruf auf eine eigene Prozedur umleite und den String mit dem MemoryViewer untersuche kann ich keinen Unterschied zwischen "Pseudotype" und "Pseudo-Pseudotype" erkennen... Die Strings sind identisch...

Re: Wie IMA-Problem durch Pseudotype finden?

Verfasst: 04.12.2015 09:36
von edel
Wenn es unter x64 laeuft, dann versuch mal PrototypeC.

Re: Wie IMA-Problem durch Pseudotype finden?

Verfasst: 04.12.2015 10:02
von _JON_
Pseudotype IMA x86, da klingelt bei mir was :shock:

So ein Problem hatte ich auch schon, es trat leider nur selten auf war nicht wirklich reproduzierbar.
Manchmal schlägt nur die API fehl, mal gibt’s ein IMA aber zu 98% läuft es.

Welche PB Version benutzt Du?

Re: Wie IMA-Problem durch Pseudotype finden?

Verfasst: 04.12.2015 10:15
von ts-soft
@_JON_
Die DLL benutzt wahrscheinlich CDECL CallingConvention, was dann zu Stackfehlern führen kann (nicht unbedingt sofort).
Bei der 64-Bit DLL ist es egal, welche CallingConvention er einstellt, die nutzt sowieso FASTCALL (nur 64-Bit).

Re: Wie IMA-Problem durch Pseudotype finden?

Verfasst: 04.12.2015 10:45
von _JON_
Ja kann sein weiß nicht mehr, aber stimmt die libVLC ist cdecl. :D

Re: Wie IMA-Problem durch Pseudotype finden?

Verfasst: 04.12.2015 23:13
von Regenduft
Ja, super Leute, vielen Dank! Es lag wirklich an der falschen Aufrufkonvention (cdecl ist richtig). :allright:

Da wäre ich nie drauf gekommen, weil der fehlerhafte Code - was mich immer noch verwundert - mit "Ascii x86" Compileroptionen problemlos lief und nur bei "Unicode" das Problem auftrat.

Re: Wie IMA-Problem durch Pseudotype finden?

Verfasst: 04.12.2015 23:19
von ts-soft
Regenduft hat geschrieben:mit "Ascii x86" Compileroptionen problemlos lief und nur bei "Unicode" das Problem auftrat.
Der Fehler wäre aber früher oder später aufgetreten <) , bei Unicode eben früher.

Wenn ein Lib/DLL Aufruf mit 64-Bit einwandfrei funktioniert, aber mit 32-Bit nicht, immer erstmal die Aufrufkonventionen prüfen.
Ist das häufigste Problem in diesem Falle, sparste also Zeit bei der Fehlersuche.

Re: Wie IMA-Problem durch Pseudotype finden?

Verfasst: 07.11.2017 23:48
von Lebostein
utf8 funktioniert!

Prototype.i libvlc_media_new_path(instance, path.p-utf8)