FreeBSD en strdup()

Pagina: 1
Acties:

  • SvMp
  • Registratie: September 2000
  • Niet online
Onder FreeBSD krijg ik een programma met strdup() niet aan de praat. Ik krijg als ik het programma draai een "bus error (core dumped)".

Zelfs een simpele
code:
1
char *test=strdup("buurp");

gaat mis.

Wat is er aan de hand?

  • SvMp
  • Registratie: September 2000
  • Niet online
[update]
strdup() werkt in een los programmaatje blijkbaar wel.

Ik zal ff de functie posten waarin ik het gebruik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int oms_connect(OMSCLIENT *omsclient, unsigned int connection_type, const char *addr) {
 oms_reset_error(omsclient);
 if (omsclient->status!=OMS_STATUS_DISCONNECTED) {
  oms_set_error(omsclient,OMS_ERROR_NOTDISCONNECTED);
  return(OMS_ERROR_NOTDISCONNECTED);
 }

 omsclient->connection_type=connection_type;
 omsclient->addr=strdup(addr);

 omsclient->mysql_host=strdup(addr);
 omsclient->mysql_port=0;
 omsclient->mysql_unix_socket=NULL;

 omsclient->mysql=mysql_init(omsclient->mysql);
 if (omsclient->mysql==NULL)
 {
  oms_set_error(omsclient,OMS_ERROR_CONNECT_OUTOFMEMORY);
  return(OMS_ERROR_CONNECT_OUTOFMEMORY);
 }

 omsclient->status=OMS_STATUS_CONNECTED;
 return(OMS_OK);
}

Deze functie komt in een dynamische library.
Functie wordt aangeroepen vanuit programma.

Vaag dat het hier juist niet werkt |:(

De structure omsclient bestaat trouwens, zelfs als ik de strdup toepas op een lokale char* dan gaat het mis...

Als ik die 2 regels met strdup verwijder gaat alles goed.
MAAR zodra ik dan deze:
code:
1
char *test=strdup("burp");

bovenin zet, gewoon correct C, in een stand-alone proggie werkt dit regeltje correct, dan krijg ik die buserror weer :(

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:13
Als ik jou programma met de eerste vier regels (foutafhandeling) en de laatste paar regels (initialisatie) eruit gesloopt en een zelfverzonnen OMSCLIENT-struct uitvoer onder FreeBSD 4.5 gaat alles goed.

Ik zou zeggen: installeer een debugger (bijvoorbeeld GDB en als je onder X werkt ook DDD), dan kom je misschien meer te weten waar het fout gaat.

  • SvMp
  • Registratie: September 2000
  • Niet online
Soultaker: Bedankt voor je hulp en alle moeite die je hebt gedaan!

Ik heb gekeken welke invloed het weghalen van dingen had, en dat gaf bij mij een andere uitwerking als bij Soultaker zijn onderzoek.

Al snel kwam ik er achter dat de fout heel ergens anders ligt, namelijk bij mysql_init:
code:
1
    omsclient->mysql=mysql_init(omsclient->mysql);

Uit de mysql manual:
24.1.3.122 mysql_init()

MYSQL *mysql_init(MYSQL *mysql)

24.1.3.123 Description

Allocates or initializes a MYSQL object suitable for mysql_real_connect(). If mysql is a NULL pointer, the function allocates, initializes, and returns a new object. Otherwise the object is initialized and the address of the object is returned. If mysql_init() allocates a new object, it will be freed when mysql_close() is called to close the connection.

24.1.3.124 Return Values

An initialized MYSQL* handle. NULL if there was insufficient memory to allocate a new object.

24.1.3.125 Errors

In case of insufficient memory, NULL is returned.
Het vetgedrukte stuk heb ik niet goed gelezen }:O
Want hieruit is te concluderen dat mijn regeltje code volstrekt onjuist is. Het valt trouwens niet goed te zien in de code maar in mijn structure is mysql van het type *MYSQL, verder niet geinitialiseerd of allocated. En dat gaat natuurlijk mis, aangezien mysql_init er al vanuit gaat dat er al geheugenruimte is gereserveerd voor MYSQL.
code:
1
    omsclient->mysql=mysql_init(NULL);

En het gaat perfect!

DOM DOM DOM |:(

Maar goed weer wat geleerd :)