Wie IMA-Problem durch Pseudotype finden?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Wie IMA-Problem durch Pseudotype finden?

Beitrag 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...
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Wie IMA-Problem durch Pseudotype finden?

Beitrag von edel »

Wenn es unter x64 laeuft, dann versuch mal PrototypeC.
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Wie IMA-Problem durch Pseudotype finden?

Beitrag 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?
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wie IMA-Problem durch Pseudotype finden?

Beitrag 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).
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Wie IMA-Problem durch Pseudotype finden?

Beitrag von _JON_ »

Ja kann sein weiß nicht mehr, aber stimmt die libVLC ist cdecl. :D
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Wie IMA-Problem durch Pseudotype finden?

Beitrag 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.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wie IMA-Problem durch Pseudotype finden?

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Re: Wie IMA-Problem durch Pseudotype finden?

Beitrag von Lebostein »

utf8 funktioniert!

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