質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

Q&A

解決済

1回答

406閲覧

gdbのcode 0221などの対処について

todasan

総合スコア78

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

0グッド

0クリップ

投稿2022/08/22 10:51

C言語からsqliteを使用しています。
macbigsurを使用しています。
GNUのバージョンはgdb (GDB) 12.1です。

・sample.c // sample.c // written by mnagaku @ 2006/04/27 // id, worker, change_line_count, commit_date // の形式のデータをDBに取り込み、 // change_line_countの総計の多いworkerのtop10と // commit数(データ数)の総計の多いworkerのtop10を調べます #include <stdio.h> #include <string.h> #include <stdlib.h> #include "sqlite3.h" #define MAX_STR 256 #define MAX_COLUMN 5 // SQL文 #define CREATE_TABLE "CREATE TABLE IF NOT EXISTS bookdata (id INTEGER PRIMARY KEY, \ bookmei TEXT NOT NULL, category TEXT NOT NULL, nesesary TEXT NOT NULL, \ commit_date TEXT NOT NULL)" #define INSERT_TABLE "INSERT OR IGNORE INTO bookdata (id, bookmei, category, \ nesesary,commit_date) values (%s, '%s', '%s', '%s', '%s')" #define SELECT_TABLE "SELECT id, bookmei, category, \ nesesary,commit_date from bookdata" // DBの検索結果を大域変数で保持 typedef struct { char values[MAX_COLUMN][MAX_STR]; } RAW; RAW *sqlResult; int rawSize, columnSize; extern void LOG_PRINT(char log_txt[256], char log_data[256]); /* 通常ログ出力関数 */ extern void delete_shoseki(); // 検索結果を1行取得する度に呼ばれるコールバック関数 static int callback(void *option, int columnCount, char **columnValues, char **columnNames) { int columnCounter; if(sqlResult == NULL) { sqlResult = (RAW *)malloc(MAX_COLUMN * MAX_STR * 2); columnSize = columnCount; } else if((sqlResult = (RAW *)realloc(sqlResult, MAX_COLUMN * MAX_STR * (rawSize + 2))) == NULL) return -1; for(columnCounter = 0; columnCounter < MAX_COLUMN && columnCounter < columnCount; columnCounter++) { if(rawSize == 1) strncpy(sqlResult[0].values[columnCounter], columnNames[columnCounter], MAX_STR); strncpy(sqlResult[rawSize + 1].values[columnCounter], columnValues[columnCounter], MAX_STR); } rawSize++; return 0; } // SQLの実行 void sqlExec(sqlite3 *db, const char *sql, sqlite3_callback cb) { char *pStr; free(sqlResult); sqlResult = NULL; rawSize = 0; if(sqlite3_exec(db, sql, cb, NULL, &pStr) != SQLITE_OK) { fprintf(stderr, "Error %s %d: %s\n%s\n", __FILE__, __LINE__, pStr, sql); sqlite3_close(db); exit(0); } } // メイン void main() { char str[MAX_STR], data[5][20], *pStr; int lineCount, dataCount; FILE *fp; sqlite3 *db; // メモリ上にDBを構築 if(sqlite3_open("shoseki.db", &db)) { fprintf(stderr, "Error %s %d: Can't open database %s\n", __FILE__, __LINE__, sqlite3_errmsg(db)); sqlite3_close(db); return; } // テーブル作成 sqlExec(db, CREATE_TABLE, NULL); // データファイル読込み if((fp = fopen("sample.csv", "rt")) == NULL) { fprintf(stderr, "Error %s %d: Can't open datafile.\n", __FILE__, __LINE__); sqlite3_close(db); return; } memset(str, '\0', sizeof(str)); fgets(str, MAX_STR, fp); //ヘッダーの読み飛ばし for(lineCount = 0; fgets(str, MAX_STR, fp) != NULL; lineCount++) { for(pStr = strtok(str, ","), dataCount = 0; dataCount < 4 && strlen(pStr) > 0 && pStr[0] != '\n'; pStr = strtok(NULL, ","), dataCount++) strncpy(data[dataCount], pStr, 20); if(dataCount < 4) { printf("Warnning %s %d: Find illegal data at %d\n", __FILE__, __LINE__, lineCount); break; } // 読み込んだデータをDBに投入 sprintf(str, INSERT_TABLE, data[0], data[1], data[2], data[3],data[4]); sqlExec(db, str, NULL); memset(str, '\0', sizeof(str)); } fclose(fp); // DBの検索 sqlExec(db, SELECT_TABLE, callback); for(int i=0;i<rawSize + 1;i++){ for(int j=0;j<columnSize;j++){ // printf("%s\n",sqlResult[i].values[j]); LOG_PRINT("data:",sqlResult[i].values[j]); } } delete_shoseki(); sqlite3_close(db); } ・result_log.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> /* ログディレクトリ(通常) */ #define LOG_FILE "LOG/log.txt" FILE *log_file; /* 通常ログ */ void LOG_PRINT(char log_txt[256], char log_data[256]); /* 通常ログ出力関数 */ void LOG_PRINT(char log_txt[256], char log_data[256]) { time_t timer; struct tm *date; char str[256]; timer = time(NULL); /* 時間取得 */ date = localtime(&timer); strftime(str, sizeof(str), "[%Y/%x %H:%M:%S] ", date); if ((log_file = fopen(LOG_FILE, "a")) == NULL) { exit(EXIT_FAILURE); /* エラーの場合は通常、異常終了する */ } /* 文字列結合 */ strcat(str,log_txt); strcat(str,log_data); strcat(str,"\n"); fputs(str, log_file); fclose(log_file); return; } ・delete_data.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include "sqlite3.h" #define MAX_DELSTR 50 void delete_shoseki(void); void delete_shoseki(void) { char str[MAX_DELSTR]; FILE *fp; sqlite3 *db; // データファイル読込み if((fp = fopen("delete.csv", "rt")) == NULL) { fprintf(stderr, "Error %s %d: Can't open datafile.\n", __FILE__, __LINE__); sqlite3_close(db); return; } memset(str, '\0', sizeof(str)); fgets(str, MAX_DELSTR, fp); //ヘッダーの読み飛ばし while(fgets(str, MAX_DELSTR, fp) != NULL) { printf("%s",str); } } ・sample.csv id,bookname,category,necessity,date 1,AAA,理工学,◯,2022/8/16 17:24 2,BBB,理工学,◯,2022/8/16 17:24 3,DDD,理工学,◯,2022/8/16 17:24 ・delete.csv id 1

上記のファイルは同一階層にあり、以下のコマンドで
コンパイルしています。
gcc -std=gnu18 -Wall -Wextra -g sample.c result_log.c delete_data.c -o sample -lsqlite3

gdbはpコマンド等の結果は正常に見れていて、以下の階層にもログ結果は出ます。
・LOG/log.txtの中身
[2022/08/22/22 19:34:53] data:id
[2022/08/22/22 19:34:53] data:bookmei
[2022/08/22/22 19:34:53] data:category
[2022/08/22/22 19:34:53] data:nesesary
[2022/08/22/22 19:34:53] data:commit_date
[2022/08/22/22 19:34:53] data:1
[2022/08/22/22 19:34:53] data:AAA
[2022/08/22/22 19:34:53] data:理工学
[2022/08/22/22 19:34:53] data:◯
[2022/08/22/22 19:34:53] data:2022/8/16 17:24

[2022/08/22/22 19:34:53] data:2
[2022/08/22/22 19:34:53] data:BBB
[2022/08/22/22 19:34:53] data:理工学
[2022/08/22/22 19:34:53] data:◯
[2022/08/22/22 19:34:53] data:2022/8/16 17:24

[2022/08/22/22 19:34:53] data:3
[2022/08/22/22 19:34:53] data:DDD
[2022/08/22/22 19:34:53] data:理工学
[2022/08/22/22 19:34:53] data:◯
[2022/08/22/22 19:34:53] data:2022/8/16 17:24

しかし、gdbを動かした後に、以下のようなエラーが出ます。
(gdb) run
Starting program: /Users/todatakako/Desktop/program_itiran/cprogfolder/sql_lite_renshuu/sample
[New Thread 0x1603 of process 1068]
[New Thread 0x2503 of process 1068]
warning: unhandled dyld version (17)
1[Inferior 1 (process 1068) exited with code 0221]
code 0221のエラーのなくしかたや、解決方法、見方などは
分かりますか。gdbは使って間もないので、お聞きしても
よろしいですか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自分で調べて、解決した。

投稿2023/01/12 02:52

todasan

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問