amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > ObtainSocket crasht - Wie GR-Infos nutzen? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

24.04.2013, 23:15 Uhr

Reth
Posts: 1751
Nutzer
Hallo allerseits,

ich versuche gerade eine ältere Version der AMarquee-Library für AOS4 zu compilieren. Mit der Serverkomponente komme ich damit auch schon durch (wobei der Linker nur mit -r zum Fertigstellen zu bewegen ist, über diese Option konnte ich aber noch nix Aufschlußreiches finden).

Leider crahst die Serverkomponente, sobald ObtainSocket gerufen wird. Die Stelle im Source ist mir bekannt (durch GR und Compilat mit Debugginginfos). Allerdings weiss ich nicht, wieso es crahst! Kann auch mit den Infos des GrimReapers leider nix anfangen (wie kann man die denn für die Fehlersuche/-analyse nutzen, abgesehen vom Auffinden der entsprechenden Stelle im Source?).

Die Infos für ObtainSocket werden aus der DaemonMessage gewonnen, die mittels FindTask() und ExitData() beschafft wird. Die ID für den Socket ist dabei immer deutlich über 65535. Family ist AF_INET und Type ist STREAM.

Leider crahst das Ganze mit nem DSI. Keine Ahnung, was da schief läuft. Könnt ihr mir da ein paar Tips geben, wie ich dem Ganzen auf die Schliche komme?

Dank euch schon mal!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

25.04.2013, 08:06 Uhr

thomas
Posts: 7648
Nutzer

Ist ISocket korrekt initialisiert?

Wenn du mit mehreren Tasks arbeitest, muss jede Task die bsdsocket.library für sich öffnen und dann mit ihrer lokalen Kopie von SocketBase und ISocket arbeiten.

Globale Variablen für SocketBase und ISocket solltest du deaktivieren mit

#define __NOLIBBASE__
#define __NOGLOBALIFACE__

vor dem #include <proto/socket.h>


--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

25.04.2013, 20:10 Uhr

Reth
Posts: 1751
Nutzer
Zitat:
Original von thomas:

Ist ISocket korrekt initialisiert?

Das wird nicht verwendet. Ist ein 68k-Source, den ich einfach durch den Compiler jage (vorher so lange angepasst, bis gcc und ld durchlaufen, wobei der ld ohne -r Fehler wirft, die er sonst nur als Warnungen ausgibt!).

Zitat:
Original von thomas:
Wenn du mit mehreren Tasks arbeitest, muss jede Task die bsdsocket.library für sich öffnen und dann mit ihrer lokalen Kopie von SocketBase und ISocket arbeiten.

Wie gesagt, ISocket wird nicht verwendet und die Lib wird in der Main-Funktione des Servermoduls geöffnet und dort einer Zeigervariablen zugewiesen, die innerhalb der main-Funktion deklariert ist. Diese wird überall durchgereicht. Die Werte aus DaemonMessage stimmen ja auch (wobei die ID-Nummern schon immer extrem große Zahlen sind). Dennoch crahst der Obtain-Socket-Aufruf, z.B. wie folgt (keine Ahnung, wie ich diese Infos nutzbringend verwenden kann, bis auf die Angaben für den Source):

Crash log for task "ANWAOS4:Prog/Source/AMarquee_AOS4/AMarqueed"
Generated by GrimReaper 53.15
Crash occured in module AMarqueed at address 0x7F202500
Type of crash: DSI (Data Storage Interrupt) exception

Register dump:
GPR (General Purpose Registers):
0: 7F2024F4 55276A00 00000000 00000000 62003AEA 020A2BEC 00000001 00000000
8: 5B367708 00000000 01A79198 021B69A6 48842022 00000000 00000000 62003340
16: 7F1FFD98 00000000 566AE760 5B367490 02270000 02270000 00000000 00000001
24: 6FF96000 00000001 00000001 566C0000 5F8158F0 5CD92054 55276B18 5B367490


FPR (Floating Point Registers, NaN = Not a Number):
0: nan 4 878 4
4: 847 312.8 966.8 4
8: 847 11 312.8 255
12: nan 65536 0 0
16: 0 0 0 0
20: 0 0 0 0
24: 0 0 0 0
28: 0 0 0 0

FPSCR (Floating Point Status and Control Register): 0x82004000


SPRs (Special Purpose Registers):
Machine State (msr) : 0x0000F030
Condition (cr) : 0x28842028
Instruction Pointer (ip) : 0x7F202500
Xtended Exception (xer) : 0x20000000
Count (ctr) : 0x0181EBD0
Link (lr) : 0x7F2024F4
DSI Status (dsisr) : 0x40000000
Data Address (dar) : 0x00000000



680x0 emulated registers:
DATA: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ADDR: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
FPU0: 0 0 0 0
FPU4: 0 0 0 0



Symbol info:
Instruction pointer 0x7F202500 belongs to module "AMarqueed" (PowerPC)
Symbol: ObtainInetdSocket + 0x68 in section 1 offset 0x000074DC

Stack trace:
[source/qcommon.c:104] ObtainInetdSocket()+0x68 (section 1 @ 0x74DC)
[source/qcommon.c:102] ObtainInetdSocket()+0x5c (section 1 @ 0x74D0)
native kernel module newlib.library.kmod+0x000020a4
native kernel module newlib.library.kmod+0x00002d0c
native kernel module newlib.library.kmod+0x00002ee8
_start()+0x170 (section 1 @ 0x16C)
native kernel module dos.library.kmod+0x00023098
native kernel module kernel+0x00043330
native kernel module kernel+0x000433b0

PPC disassembly:
7f2024f8: 88dd0025 lbz r6,37(r29)
7f2024fc: 38e00000 li r7,0
*7f202500: 81690000 lwz r11,0(r9)
7f202504: 809d001c lwz r4,28(r29)
7f202508: 7d635b78 mr r3,r11

Für weitere Ideen und Vorschläge bin ich sehr dankbar!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

25.04.2013, 23:31 Uhr

thomas
Posts: 7648
Nutzer


... denn sie wissen nicht, was sie tun.

Lass bitte -D__USE_INLINES__ weg und schreib den Source-Code so um, dass er für OS4 passt. Dann merkst du sehr schnell, wo du ISocket benutzt.

Jedes OpenLibrary in einem 68k-Source muss für OS4 mit einem GetInterface ergänzt werden und jedes CloseLibrary mit einem DropInterface.


--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

26.04.2013, 16:32 Uhr

Reth
Posts: 1751
Nutzer
@thomas:
Kann ich probieren. Zumindest weiss ich soviel, dass -D__USE_INLINES__ dafür sorgen sollte, dass ich 68k-Source ohne zusätzliches Interface-Handling usw. verwenden kann!
Wenn das bei bsdsocket.libaray nicht funktionieren sollte, dann ist das natürlich schlecht!

Mir ist schon klar, dass ich mit -D__USE_INLINES__ implizit die Interfaces nutze, überall dort, wo im 68k-Source Libraryaufrufe erfolgen (im konkreten Fall über die geöffnete bsdsocket.library)!

Oder hast Du hier an etwas anderes gedacht, worauf sich Dein Vorschlag des Weglassens bezieht?
Sprich konkreter: Wo genau versprichst Du Dir Hilfe beim aktuellen Problem, wenn ich den Source von 68k auf AOS4-only umstelle? Erwartest Du ein anderes Verhalten?


[ Dieser Beitrag wurde von Reth am 26.04.2013 um 19:25 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

26.04.2013, 20:28 Uhr

thomas
Posts: 7648
Nutzer
Zitat:
Original von Reth:
@thomas:
Kann ich probieren. Zumindest weiss ich soviel, dass -D__USE_INLINES__ dafür sorgen sollte, dass ich 68k-Source ohne zusätzliches Interface-Handling usw. verwenden kann!


Das stimmt nicht. Das einzige, das __USE_INLINES__ macht, ist diese unsäglichen IDOS->, IExec->, IGraphics->, ISocket-> usw. automatisch einzufügen.


Zitat:
Wenn das bei bsdsocket.libaray nicht funktionieren sollte, dann ist das natürlich schlecht!

Natürlich funktioniert das bei bsdsocket genauso wie bei allen anderen Libraries.


Zitat:
Mir ist schon klar, dass ich mit -D__USE_INLINES__ implizit die Interfaces nutze, überall dort, wo im 68k-Source Libraryaufrufe erfolgen (im konkreten Fall über die geöffnete bsdsocket.library)!

Ganz genau. Library-Aufrufe. Interfaces werden implizit benutzt aber nicht initialisiert. Durch die auto.lib (bzw. libauto.a) werden die meisten System-Libraries implizit automatisch geöffnet und das dazugehörige Interface initialisiert. Wenn du eine Library aber explizit öffnest, dann musst du auch das dazugehörige Interface explizit initialisieren.


Zitat:
Oder hast Du hier an etwas anderes gedacht, worauf sich Dein Vorschlag des Weglassens bezieht?
Sprich konkreter: Wo genau versprichst Du Dir Hilfe beim aktuellen Problem, wenn ich den Source von 68k auf AOS4-only umstelle? Erwartest Du ein anderes Verhalten?


Dadurch, dass du überall ISocket-> einfügen musst, wo es benötigt wird, erkennst du, wo es benutzt wird. Und dass es benutzt wird.

Und wie schon gesagt, wenn du die bsdsocket.library in mehreren Prozessen benutzt, dann muss jeder Prozess die Library für sich öffnen und das Interface initialisieren und dann nur noch mit seiner Version der Library-Base und des Interface-Pointers arbeiten. Das ist eine Besonderheit der bsdsocket.library, die man einhalten muss.


--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

28.04.2013, 21:07 Uhr

Reth
Posts: 1751
Nutzer
@thomas:
Ok, verstanden. Aber durch Nutzung von

#define __NOLIBBASE__
#define __NOGLOBALIFACE__

muss ich natürlich auch alle anderen verwendeten Libs selbst öffnen, und deren Interfaces gleich mit (natürlich auch schließen) - bis auf DOS und Exec.

Dabei noch eine Frage: Wie bestimmt man denn eine Libraryversion unter AOS4?

[ - Antworten - Zitieren - Direktlink - ]

28.04.2013, 21:44 Uhr

ZeroG
Posts: 1482
Nutzer
Zitat:
Original von Reth:
Dabei noch eine Frage: Wie bestimmt man denn eine Libraryversion unter AOS4?


Wenn einem die Versionsangabe die man bei OpenLibrary() macht nicht reicht, funktioniert das genau wie unter OS3 mit den lib_Version und lib_Revision UWORDs aus struct Library.

[ - Antworten - Zitieren - Direktlink - ]

28.04.2013, 22:18 Uhr

Reth
Posts: 1751
Nutzer
@ZeroG:
Ah, sorry. Hast recht! Hatte ganz vergessen, dass die LibBase ja auch im Interface verzeigert ist!

Danke - auch an Thomas für seine Tips!

[ - Antworten - Zitieren - Direktlink - ]

29.04.2013, 08:46 Uhr

thomas
Posts: 7648
Nutzer
Zitat:
Original von Reth:
@thomas:
Aber durch Nutzung von

#define __NOLIBBASE__
#define __NOGLOBALIFACE__

muss ich natürlich auch alle anderen verwendeten Libs selbst öffnen, und deren Interfaces gleich mit (natürlich auch schließen) - bis auf DOS und Exec.


Wie wär's damit:

code:
/* auto-open libs */
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/utility.h>

/* manually opened libs */
#define __NOLIBBASE__
#define __NOGLOBALIFACE__
#include <proto/socket.h>
#include <proto/cybergraphics.h>
#include <proto/mpega.h>



--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > ObtainSocket crasht - Wie GR-Infos nutzen? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1997-2019 by amiga-news.de - alle Rechte vorbehalten.
.