2016-10-16 5 views
0

Я получил это исключение, запустив LLDB для своей программы.Как использовать lldb для отладки ошибки сегментации

Однако исключение не дало мне каких-либо конкретных подсказок для определения основной причины.

Конечно, исходя из опыта, я могу получить доступ к памяти неправильно.

Любая идея найти основную причину LLDB? Благодаря

continue to play (y/n)? y 
Process 30020 stopped 
* thread #1: tid = 0x24b72, 0x00007fff893c8365 libsystem_platform.dylib`_platform_strncmp + 325, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x79) 
    frame #0: 0x00007fff893c8365 libsystem_platform.dylib`_platform_strncmp + 325 
libsystem_platform.dylib`_platform_strncmp: 
-> 0x7fff893c8365 <+325>: movzbq (%rsi,%rcx), %r8 
    0x7fff893c836a <+330>: subq %r8, %rax 
    0x7fff893c836d <+333>: jne 0x7fff893c837d   ; <+349> 
    0x7fff893c836f <+335>: testq %r8, %r8 
(lldb) 
error: No auto repeat. 

код

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <memory.h> 

const int USER_INPUT_SIZE_EACH_LINE = 999; 

void draw_middle_lines(char *middle_line, int width) { 
    printf("%s", middle_line); 
    for (int i = 2; i < width; i++) { 
     printf(" "); 
    } 
    printf("%s\n", middle_line); 
} 

void draw_bound_line(char *bound_char, int width) { 
    for (int i = 0; i < width; i++) { 
     printf("%s", bound_char); 
    } 
    printf("\n"); 
} 


void clearNewline(char *line, int max_len) { 
    for (int i = 0; i < max_len; i++) { 
     if (line[i] == '\n') { 
      line[i] = '\0'; 
     } 
    } 
} 

char **ask_user_preference() { 
    const int NUM_OF_PROMPTS = 4; 
    char *prompt[] = { 
      "please input height:", 
      "please input width:", 
      "please input horizontal char:", 
      "please input vertical char:", 
    }; 
    char **preference; 
    preference = malloc(NUM_OF_PROMPTS); 
    for (int i = 0; i < NUM_OF_PROMPTS; i++) { 
     preference[i] = malloc(USER_INPUT_SIZE_EACH_LINE); 
     memset(preference[i], 0, sizeof(char) * USER_INPUT_SIZE_EACH_LINE); 
     printf("%s", prompt[i]); 
     fgets(preference[i], USER_INPUT_SIZE_EACH_LINE, stdin); 
     clearNewline(preference[i], USER_INPUT_SIZE_EACH_LINE); 
    } 
    return preference; 
} 

void draw(int w, int h, char *bound_char, char *middle_char) { 
    draw_bound_line(bound_char, w); 
    for (int i = 2; i < h; i++) { 
     draw_middle_lines(middle_char, w); 
    } 
    draw_bound_line(bound_char, w); 
} 

void clr_input_buffer() { 
    for (;;) { 
     int c = getchar(); 
     if (c == EOF || c == '\n') 
      break; 
    } 

} 

int main() { 
    char *cont; 
    do { 
     char **pref = ask_user_preference(); 
     int height = atoi(pref[0]); 
     int width = atoi(pref[1]); 
     char *bound_char = pref[2]; 
     char *middle_char = pref[3]; 
     draw(width, height, bound_char, middle_char); 
     printf("continue to play (y/n)? "); 
     fgets(cont, 10, stdin); 
     if (strncmp(cont, 'y', 1) != 0) { 
      break; 
     } 
    } while (1); 
    printf("BYE BYE~"); 
    return 0; 
} 

ответ

0

Функция вызова

strncmp(cont, 'y', 1) 

, скорее всего, приведет к Segfault, потому что 'y' это символьное значение передается в ячейку памяти. Я предлагаю

strncmp(cont, "y", 1) 

хотя я не уверен в смысле вашего сравнения. В любом случае, я рекомендую, чтобы это было лучше

toupper(cont[0]) == 'Y' 

, и я оставляю смысл сравнения с вами. Наконец, включите все предупреждения компилятора, которые поймали бы это.

+0

привет, спасибо за это хороший пункт. проблема сегрегации была исправлена. однако, есть ли способ сделать этот вопрос более вероятным? кажется, вы используете свой опыт, чтобы исправить это, а не с помощью сообщения отладчика или исключения. ^^ – newBike

+0

Компилятор выдает предупреждение. –

+0

На самом деле компилятор MSVC выдает * два * предупреждения: один о типе параметра и один об уровне косвенности. –

 Смежные вопросы

  • Нет связанных вопросов^_^