Search Results: tag:C_language

14 件ヒットしました。 1 - 10 番目を表示しています。

C_language debug gdb malloc で確保した配列を一度に表示する

「@」でサイズを指定すればよい。

double *ptr = (double *) malloc(sizeof(double) * 5);

となっているような場合に gdb で

p ptr@5

とすると5個 double が表示される。

C_language debug glib を使ったプログラムを valgrind でメモリリークをチェックする

https://live.gnome.org/Valgrind にあるように G_SLICE と G_DEBUG の環境変数を設定するとよい。

G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind --leak-check=full --show-reachable=yes --log-file=valgrind.log ./a.out

C_language autoconf Autoconf で GMP を使う

configure.ac に

AC_CHECK_LIB(gmp, __gmpz_init)

を書く。

C_language GLib ディレクトリの中にあるファイルをソートする

GLib を使う。ディレクトリの中のファイル一覧を取得して、 それを GPtrArray に入れてソートする。

static gint string_compare (gconstpointer a, gconstpointer b)
{
  return (gint) strcmp(*(const char **) a, *(const char **) b);
}

int main ()
{
  GDir *dir;
  GPtrArray *files;
  const char *filename;

  dir = g_dir_open("/path/to/directory", 0, NULL);
  if (dir == NULL) {
    fprintf(stderr, "Can not open directory\n");
    abort();
  }

  files = g_ptr_array_new();
  while ((filename = g_dir_read_name(dir))) {
    g_ptr_array_add(files, (gpointer) filename);
  }
  g_ptr_array_sort(files, (GCompareFunc) string_compare);

  for(i = 0; i < files->len; i++) {
    printf("%s\n", g_ptr_array_index(files, i));
  }

  g_ptr_array_free(files, FALSE);
  g_dir_close(dir);
  return 0;
}

g_dir_read_name で取得した文字列は g_dir_close で開放されるようだ。

C_language debug gdb ブレークポイントに条件をつける

まず、ブレークポイントを設定する。

b func

このブレークポイントに条件を加えるには、condition を使う。 ブレークポイントの番号が 1 だとすると、その番号を指定して

condition 1 val == 3

のようにして指定する。これは変数 val が 3 のときにプログラムが停止する。

C_language debug gdb ブレークポイントを削除する

まず、ブレークポイントの一覧を

info breakpoints

で表示し、ブレークポイントの番号を確認する。 delete で削除したいブレークポイントの番号を指定して削除する。

delete 3

C_language debug gdb バックトレースを表示する

まず、Ubuntu 11.10 だと coredumpsize が 0 になっている。 デバッグのためには

limit coredumpsize 10000

のように指定して core ファイルが作成されるようにする。

そして gdb を使えばバックトレースを表示できる。 コンパイル時にgccに-gオプションをつけた場合はファイル名と行番号も表示される。

gdb a.out core

また、glibc に含まれる backtrace() と backtrace_symbols_fd() を使うと 実行中のCプログラムのバックトレースを表示することができる。 詳細はglibcのマニュアルを参照。

C_language debug gdb libtool で gdb を使う

普通に

gdb ./prog

のようにやってもうまくいかない。

libtool --mode=execute gdb ./prog

のように libtool を使って実行する。

C_language ヘッダファイルを最初の一回だけ include する

マクロを #ifndef の中で定義すると、初回は定義されていないので #ifndef の中は一度だけ実行される。

#ifndef _LOAD_HEADER_
#define _LOAD_HEADER_
 ...
#endif

C_language debug gcc で警告を(多く)表示させるオプション

gcc -Wall -Wextra -Wformat=2 -Wstrict-aliasing=2 -Wcast-qual \
  -Wcast-align -Wconversion -Wfloat-equal -Wpointer-arith -Wswitch-enum foo.c