staging.inyokaproject.org

Segmentation fault bei Ausführung

Status: Gelöst | Ubuntu-Version: Ubuntu 17.04 (Zesty Zapus)
Antworten |

abstract

Anmeldungsdatum:
18. September 2017

Beiträge: Zähle...

Hallo zusammen, ich reite grade bisschen auf einem problem herum und bin bisher nicht auf die zündende Idee bekommen ☺

ich teste grade teile meines Prgramms und verwende ein paar struct arrays die (scheinbar) den seg fault bei der ausführung auslösen. (kompilieren klappt einwandfrei)

meine main:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "data_structures.h"
#include "setPixel.h"
#include "filled_raster_circle_function.h"
#include "raster_circle_function.h"
#include "max_CDN.h"
#include "define_RObj.h"

int main() {

    int m_x;
    int m_y;
    int rad;
    int i;
    int j;
    int k;

    in_sze = (sizeof(RCL_INPUT)/sizeof(RCL_INPUT[0]));//-1;
    printf("%d\n", in_sze);

    printf("m_x: ");
    scanf("%d", &m_x);
    printf("m_y: ");
    scanf("%d", &m_y);
    printf("rad: ");
    scanf("%d", &rad);

    printf("rad_max: %d\n", max_CDN[rad]);

    /*********TEST**********/

    struct CDN D3ACU[(sizeof(RCL_INPUT)/sizeof(RCL_INPUT[0]))][68][488];
    struct PRTCDN RObj[CDN_num];
    struct USTATS UNIT;
    define_RObj(rad, max_CDN[rad], D3ACU, RCL_INPUT, RObj, UNIT);


    for(i = 0; i < CDN_num; i += 1){
        printf("Object %d: %d\n", i, RObj[i].rcl_value);
    }

    return 0;

}

aus der eingehängten data_structures.h:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[...]

struct RCL{
    int x_axis;
    int y_axis;
    int rcl_value;
    //char type[20];
};



struct RCL RCL_INPUT[] = {
    {475, 501, 160},
    {497, 494, 160},
    {507, 494, 160},
    {503, 502, 160},
    {509, 501, 160},
    {497, 506, 160},
    {485, 505, 160},
    {484, 503, 160},
    {510, 507, 389},
    {515, 505, 389},
    {524, 503, 160},
    {522, 515, 389},
    {532, 517, 241},
    {537, 512, 389},
    {539, 522, 241},
    {544, 522, 241},
    {547, 522, 389},
    {551, 517, 158},
    {476, 487, 160},
    {486, 517, 389},
    {491, 515, 160},
    {492, 512, 160},
    {495, 511, 389},
    {500, 515, 389},
    {499, 518, 160},
    {499, 523, 389},
    {502, 527, 389},
    {490, 529, 911},
    {504, 535, 911},
    /*{507, 512, 389},
    {506, 516, 389},
    {512, 519, 389},
    {515, 545, 911},
    {521, 531, 389},
    {517, 529, 241},
    {518, 526, 241},
    {540, 531, 241},
    {535, 531, 241},
    {537, 538, 241},
    {547, 551, 241},
    {558, 545, 241},
    {565, 528, 241},
    {573, 540, 241}*/

};
 [...]

Ich habe in der header den array ab Zeile 42 auskommentiert, da dass Programm bis hier einwandfrei läuft. Ab 29 zugewiesenen Werten gibt mir das Programm dann beim ausführen die Fehlermeldung.

gdb erzählt mir dann folgendes (was aus meiner Sicht keinen Sinn ergibt):

1
2
0x0000555555555286 in main () at x_test.c:21
21	    printf("%d\n", in_sze);

entschuldigt bitte den Stil, aber ich bin grade noch mitten drin 😉

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Oh, man darf mittlerweile Variablen auch innerhalb einer Funktion deklarieren. Hatte ich noch gar nicht mitbekommen. ☺

Wo wird denn in_sze deklariert? Woher kommt CDN_num? Generell sollte man die Daten nicht im Header deklarieren. Dann werden sie ja in alle Objekt-Dateien einkompiliert, die diesen Header einbinden. (Oder liege ich da falsch?)

abstract

(Themenstarter)

Anmeldungsdatum:
18. September 2017

Beiträge: 4

CDN_num hab ich ausgelagert, weil das ne größere liste ist. in_sze ist auch in ner header drin. im moment hab ich das mal so gemacht (übersicht). Wie gesagt kompilieren klappt ja einwandfrei, das problem scheint nur irgendwie in der länge des struct arrays zu liegen. Das Programm läuft auch dementsprechend wenn ich Zeile 41 auch auskommentiere.

edit: variablen in der Funktion deklarieren... ging das für lokale Variablen nicht schon immer?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@abstract: Nee, lokale Variablen mitten in Funktionen deklarieren geht erst seit C99. Vorher musste man immer alle Variablen deklarieren bevor der Code einer Funktion kam.

Zeig am besten mal ein minimales aber vollständiges Beispiel das den Absturz hat, das wir nachvollziehen können. Ohne alles zu kennen was da beteiligt ist, wird das ein wildes Raten. ☺

Mit welchen Optionen ist das denn kompiliert? Wenn man Optimierungen aktiviert, dann ist nicht mehr sichergestellt, das man auch die richtige Quelltextzeile beim Absturz gesagt bekommt.

abstract

(Themenstarter)

Anmeldungsdatum:
18. September 2017

Beiträge: 4

C99... das hab ich definitiv noch nicht mitbekommen 😀

kompiliert habe ich nur mit gcc -g, sonst nix grade.

Man sieht ja an den #include direktiven das es paar dateien sind (ich wollte hier nicht seitenlang posten). Soll ich das mal auf git laden? bin für jede hilfe dankbar, auch wenns warscheinlich nacher wieder so ein leichtsinnsfehler war xD Ich hatte sowas bisher noch nicht, und finde grade keinen Einstiegspunkt um den Fehler zu finden.

Wie auch immer. Da müssten jetzt alle dateien sein die ich zum kompilieren verwendet habe: https://github.com/OCGDFS/BO-Engine

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@abstract: Also generell ist das Definieren von Variablen und sogar ganzen Funktionen in Header-Dateien eher ungewöhnlich. Da würde ich nur Deklarationen rein schreiben. Und das ganze mit #ifdef und #define gegen mehrfaches einfügen schützen.

Dein Problem scheint die Stack-Grösse zu sein. Normal sind unter Linux 8 MiB, das heisst das ist dann auch die maximale Grösse an lokalen Variablen die in Funktionen existieren dürfen welche gleichzeitig aktiv sind. Deine main() sprengt diesen Rahmen anscheinend schon. Wenn ich die Stack-Grösse mit ulimit -s 16384 verdoppele, dann kommt der Programmablauf über das printf() hinaus.

abstract

(Themenstarter)

Anmeldungsdatum:
18. September 2017

Beiträge: 4

Vielen Dank! da wäre ich nie drauf gekommen ☺

Antworten |