Gambas Interpreter Crash

Fragen zum Thema Installation von Gambas

Re: Gambas Interpreter Crash

Beitragvon CarloScr » Mo 19. Jan 2015, 14:46

Hallo gambi,

hab ich alles schon probiert, siehe oben. Es scheint in Gambas sehr schwierig zu sein c-Bibliotheken aufzurufen, besonders wenn die Datentypen komplexer werden. Wenn ich das nicht bis Ende dieser Woche geschafft habe, dann kann ich Gambas in die Tonne treten.
CarloScr
Foriker
 
Beiträge: 40
Registriert: Do 11. Dez 2014, 13:14

Re: Gambas Interpreter Crash

Beitragvon CarloScr » Do 12. Feb 2015, 14:45

Hallo tux_

ich dieses Problem jetz auch in C analysiert, hier das Codesnippet
Code: Alles auswählen
  HIDInterface*  hid[7];  // Composite device with 7 interfaces.
  hid_return ret;
  int interface;
  Calibration_AIN table_AIN[NGAINS_1608FS][NCHAN_1608FS];
 
  // Debug information.  Delete when not needed   
  //  hid_set_debug(HID_DEBUG_ALL);
  //  hid_set_debug_stream(stderr);
  //  hid_set_usb_debug(2);

start:
  ret = hid_init();
  if (ret != HID_RET_SUCCESS) {
    fprintf(stderr, "hid_init failed with return code %d\n", ret);
    return -1;
  }

  for ( i = 0; i <= 6; i++ ) {
    if ((interface = PMD_Find_Interface(&hid[i], i, USB1608FS_PID)) < 0) {
      fprintf(stderr, "USB 1608FS not found.\n");
      exit(1);
    } else {
      printf("USB 1608FS Device is found! Interface = %d\n", interface);
     printf("hid[%d] = %x      Interface:%d\n",i,&hid[i],interface);   
    }
  }


Das zeigt hier klar den Inhalt der Pointer auf die Pointer auf HIDInterface

USB 1608FS Device is found! Interface = 0
hid[0] = bec6aea8 Interface:0
USB 1608FS Device is found! Interface = 1
hid[1] = bec6aeac Interface:1
USB 1608FS Device is found! Interface = 2
hid[2] = bec6aeb0 Interface:2
USB 1608FS Device is found! Interface = 3
hid[3] = bec6aeb4 Interface:3
USB 1608FS Device is found! Interface = 4
hid[4] = bec6aeb8 Interface:4
USB 1608FS Device is found! Interface = 5
hid[5] = bec6aebc Interface:5
USB 1608FS Device is found! Interface = 6
hid[6] = bec6aec0 Interface:6


hier sieht man den 4 byte Abstand zwischen den Pointern. Ersetze ich jetzt in der Ausgabe &hid[i] mit hid[i] sieht man die Zeiger auf die HIDInterface-Structurblöcke

USB 1608FS Device is found! Interface = 0
hid[0] = 7e67e8 Interface:0
USB 1608FS Device is found! Interface = 1
hid[1] = 7e6870 Interface:1
USB 1608FS Device is found! Interface = 2
hid[2] = 7e6918 Interface:2
USB 1608FS Device is found! Interface = 3
hid[3] = 7e69c0 Interface:3
USB 1608FS Device is found! Interface = 4
hid[4] = 7e6a68 Interface:4
USB 1608FS Device is found! Interface = 5
hid[5] = 7e6b10 Interface:5
USB 1608FS Device is found! Interface = 6
hid[6] = 7e6bb8 Interface:6


zwischen 0 und 1 ist die Differenz 136, sonst 168. Das ganze Programm "test-usb1608FS" funktioniert fehlerfrei.

Nun der Gambas_Ansatz:
gambas code
Extern hid_init() As Integer In "libhid"
Extern PMD_Find_Interface(hid As Pointer, interface As Integer, prod_ID As Integer) As Integer In "libmcchid"

Private Const HID_RET_SUCCESS As Integer = 0
Private Const USB1608FS_PID As Integer = &7d ' = 125


Public Sub Form_Open()
Dim Hid As New Pointer[7]
Dim ret_int As Integer
Dim i As Integer
Dim interface As Integer

ret_int = -1
ret_int = hid_init()
Debug "hid_init:ret_int = ", ret_int
If ret_int <> HID_RET_SUCCESS Then Debug "HID-Initialisation failed"
For i = 0 To 6
interface = PMD_Find_Interface(VarPtr(Hid[i]), i, 125)
Next
End


Das liefert "Syntax error.Varptr() takes only one identifier in FMain.class 21"
mache ich nun folgenden Ansatz:

gambas code
Public Sub Form_Open()
Dim Hid As New Pointer[7]
Dim ret_int As Integer
Dim i As Integer
Dim interface As Integer
Dim Hidp As Pointer

ret_int = -1
ret_int = hid_init()
Debug "hid_init:ret_int = ", ret_int
If ret_int <> HID_RET_SUCCESS Then Debug "HID-Initialisation failed"
For i = 0 To 6
interface = PMD_Find_Interface(Hidp, i, 125)
Next
End


Jetzt müsste mir das Programm doch einen Pointer auf eine der indizierten HIDInterface-strukturen liefern, die ich in "i" angegeben habe. Aber ich bekomme "The program has stopped unexpectedly - Segmentation fault 11"

Was mach ich hier nur falsch ? Ist mein denkansatz richtig ?

Mfg CarloScr
CarloScr
Foriker
 
Beiträge: 40
Registriert: Do 11. Dez 2014, 13:14

Re: Gambas Interpreter Crash

Beitragvon tux_ » Sa 14. Feb 2015, 15:07

Das liefert "Syntax error.Varptr() takes only one identifier in FMain.class 21"


Das ist in der Tat ein Problem in Gambas, das man angehen sollte -- vor allem, weil Minisini selbst dir den Tipp mit VarPtr(aArray[iIndex]) gegeben hat. Er dachte wohl, dass diese Syntax unterstuetzt wird. Ich werde versuchen, das zu klaeren.

In der Zwischenzeit kannst du folgendes probieren, mit Aenderungen nur an den drei markierten Zeilen:
gambas code
Extern hid_init() As Integer In "libhid"
Extern PMD_Find_Interface(hid As Pointer, interface As Integer, prod_ID As Integer) As Integer In "libmcchid"

Private Const HID_RET_SUCCESS As Integer = 0
Private Const USB1608FS_PID As Integer = &7d ' = 125

Public Sub Form_Open()
Dim Hid As New Pointer[7]
Dim ret_int As Integer
Dim i As Integer
Dim interface As Integer
Dim iHid As Integer ' (*)

ret_int = -1
ret_int = hid_init()
Debug "hid_init:ret_int = ", ret_int
If ret_int <> HID_RET_SUCCESS Then Debug "HID-Initialisation failed"
For i = 0 To 6
interface = PMD_Find_Interface(VarPtr(iHid), i, 125) ' (*)
Hid[i] = iHid ' (*)
Next
End

Man umgeht die Syntax-Beschraenkung von VarPtr() fuer Arrays, indem man VarPtr() auf eine neue lokale Variable anwendet und die Variable danach ins das Array schreibt.

Zur Information: dein zweiter Ansatz ist nicht richtig, denn Hidp ist nicht initialisiert. In Gambas bedeutet das, dass der Pointer den Wert NULL hat und wenn PMD_Find_Interface() versucht, an den NULL-Pointer zu schreiben, dann gibt es einen Segfault.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!
tux_
Site Admin
 
Beiträge: 941
Registriert: Di 11. Nov 2008, 20:05

Re: Gambas Interpreter Crash

Beitragvon CarloScr » Di 17. Feb 2015, 08:00

Hallo tux_,

das habe ich auch schon ausprobiert, hat aber nichts geholfen.
Ich hab jetzt mal noch andere Funktionen dieser Library aufgerufen, alle produzierten Crash.
Was ich einfach komisch finde ist:
1.) ich hab den third-party-driver von FTDI benutzt, mit dem sich nach einigen Anfangsschwierigkeiten unter Gambas ganz gut arbeiten lässt. Es gab bis jetzt keine Abstürze.
2.) Der third-party-driver von MCC verursacht bei einen Aufruf durch Gambas immer Abstürze (nur bei einer Funktion ohne Argumente nicht), während bei Aufrufen aus C Alles einwandfrei läuft.
Kann es sein, dass es an den Compiler-oder Linkeroptionen liegt, dass die Bibliotheksfunktionen von C aus aufgerufen werden können und von Gambas nicht ?
Ich hab da noch zu wenig Ahnung von dem ganzen Getriebe.

Die Übergabe eines indizierten Parameters ist mir nicht so wichtig, das kann man umgehen. Wichtig ist mir nur, dass auch die MCC-Bibliothek läuft, sonst muss ich nach einer anderen Lösung suchen.

MfG
CarloScr

PS

Folgendes Programm habe ich jetzt unter valgrind laufen lassen
gambas code
Public Sub Form_Open()
Dim Hid As New Pointer[7]
Dim ret_int As Integer = -1
Dim i As Integer = 0
Dim interface As Integer = 0
Dim Hidp As Pointer
Dim ihid As Integer = 0

ret_int = hid_init()
Debug "hid_init:ret_int = ", ret_int
If ret_int <> HID_RET_SUCCESS Then Debug "HID-Initialisation failed"
Hidp = VarPtr(ihid)
For i = 0 To 6
interface = PMD_Find_Interface(Hidp, 1, 0)
Next
End


und habs so laufen lassen:
shell code
bananapi@lemaker:~/Public/USBTestProgs/MCC_Proj/MCC_1608FS$ valgrind --tool=memcheck --num-callers=50 gbx3 > valgrind.out 2>&1


die valgrind ausgabe habe ich angehängt, vielleicht hilfts weiter

mfg Carlo Scr
Dateianhänge
valgrind.txt
(247.06 KiB) 495-mal heruntergeladen
CarloScr
Foriker
 
Beiträge: 40
Registriert: Do 11. Dez 2014, 13:14

Re: Gambas Interpreter Crash

Beitragvon tux_ » Di 17. Feb 2015, 15:09

Kann es sein, dass es an den Compiler-oder Linkeroptionen liegt, dass die Bibliotheksfunktionen von C aus aufgerufen werden können und von Gambas nicht ?
Ich hab da noch zu wenig Ahnung von dem ganzen Getriebe.


Das geht mehr in Richtung libffi. Das ist die Bibliothek, die Gambas benutzt, um EXTERN-Funktionen aufzurufen. Wenn die Bibliothek von C aus ansprechbar ist, sollte libffi das aber hinbekommen... Andererseits klingt es seltsam, dass ein Absturz passiert, sobald du Argumente uebergibst. Kannst du die Datei pmd.c, in der scheinbar die PMD_Find_Interface()-Funktion liegt, mal ausfindig machen und anhaengen?

Danach gehen mir aber wirklich die Ideen aus.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!
tux_
Site Admin
 
Beiträge: 941
Registriert: Di 11. Nov 2008, 20:05

Re: Gambas Interpreter Crash

Beitragvon CarloScr » Di 17. Feb 2015, 17:44

Hallo tux_

libffi hatte ich auch schon in verdacht, aber da habe ich wenig Zugriff.

hier ist die pmd.c. ich bin gerade noch mit dem Author dieser bibliothek in kontakt. da ich in Zeile 76 so eine Bemerkung gefunden habe.

MfG CarloScr
Dateianhänge
pmd.c
(6.24 KiB) 467-mal heruntergeladen
CarloScr
Foriker
 
Beiträge: 40
Registriert: Do 11. Dez 2014, 13:14

Re: Gambas Interpreter Crash

Beitragvon tux_ » Mi 18. Feb 2015, 00:48

Genau diese Zeile hatte ich auch im Blick. Die Absturzursache ist in der valgrind.txt sehr gut unter einigen anderen Fehlern versteckt, lautet aber so:

Code: Alles auswählen
==5307== Process terminating with default action of signal 11 (SIGSEGV)
==5307==  Bad permissions for mapped region at address 0x2C41B
==5307==    at 0x400AF90: _dl_signal_error (dl-error.c:94)
==5307==    by 0x400B0DF: _dl_signal_cerror (dl-error.c:155)
==5307==    by 0x4007979: _dl_lookup_symbol_x (dl-lookup.c:779)
==5307==    by 0x400A9CD: _dl_fixup (dl-runtime.c:111)
==5307==    by 0x400F19B: _dl_runtime_resolve (dl-trampoline.S:57)
==5307==    by 0x68962D1: PMD_Find_Interface (pmd.c:76)
==5307==    by 0x49B4947: ffi_call_VFP (in /usr/lib/arm-linux-gnueabihf/libffi.so.6.0.1)


Wie du siehst, geht der Fehler (ab einem bestimmten Punkt) von pmd.c:76 aus... Leider steht in dieser Zeile nicht wirklich etwas, das einem sofort "Segfault" suggeriert. Aber dort wird eine Funktion aufgerufen und valgrind sagt, dass man nach _dl_runtime_interface() springt, also in den dynamischen Linker, der wahrscheinlich erst einmal die Funktion raussuchen muss, die dort aufgerufen wird. Es koennte also ein Problem sein, dass zusammen mit deiner 3rd-party-Bibliothek, Gambas und dem dynamischen Linker auftritt.

Ich bin mit meiner Weisheit am Ende (ich schwimme hier ja auch nur trocken, weil die Hardware fehlt), aber wenn du noch etwas dazu herausfinden solltest, wuerde ich es gern hoeren.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!
tux_
Site Admin
 
Beiträge: 941
Registriert: Di 11. Nov 2008, 20:05

Re: Gambas Interpreter Crash

Beitragvon CarloScr » Mi 18. Feb 2015, 09:48

Hallo tux_

das hört sich nicht gut an, da mir hier einfach die Erfahrung mit Linux fehlt, ich mach das erst 4 Monate. Hab vorher viel in VB unter Windows programmiert. Die Debugtolls kenne ich auch zu wenig, um hier weiter zu kommen. Einen Ansatz habe ich noch, dann muß ich das knicken und wieder von vorne anfangen. Windows will ich auf jeden Fall nicht mehr.

MfG Carlo Scr
CarloScr
Foriker
 
Beiträge: 40
Registriert: Do 11. Dez 2014, 13:14

Re: Gambas Interpreter Crash

Beitragvon CarloScr » Do 19. Feb 2015, 11:21

Hallo tux_,

ich habe jetzt vom Autor der Software eine "more basic version" bekommen, die, so wie es jetzt nach einem kurzen Test aussieht, nach Gambas portierbar ist und läuft.

Danke für Deine sehr geschätzte Unterstützung.

MfG CarloScr
CarloScr
Foriker
 
Beiträge: 40
Registriert: Do 11. Dez 2014, 13:14

Vorherige

Zurück zu Wie geht was ...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron