gdbで実行中のプロセスをデバグする方法

November 20,2018 12:03 AM
Category:[C/C++]
Tag:[C++, gdb]
Permalink

gdbで実行中のプロセスをデバグする方法を紹介します。

1.問題点

C++のサンプルプログラム(test.cc)を作りました。

#include <iostream>
 
int main() {
    while (1) {
        std::cout << "Hello World!!" << std::endl;
        sleep(3);
    }
    return 0;
}

コンパイルして、バイナリ(a.out)を作ります。

% g++ test.cc
% ls
a.out  test.cc

このプログラムをgdbでデバグするには、

% gdb a.out

という風に、gdbコマンドでバイナリファイルを起動させるか、コアダンプを利用して、

% gdb a.out コアダンプ

という風に、バイナリとコアダンプを指定する方法がありますが、実行中のプロセスにgdbで割り込んでデバグする方法が分かりません。

ということで、gdbで実行中のプロセスをデバグする方法を紹介します。

2.gdbで実行中のプロセスをデバグする

gdbで実行中のプロセスをデバグするには、まずプロセスIDを調べます。

% ps -ef | grep a.out
root     17982 17876  0 18:53 pts/2    00:00:00 ./a.out
root     17984 17955  0 18:53 pts/3    00:00:00 grep a.out

そしてgdbを起動するときに"-p"オプションでプロセスIDを指定すれば、実行中のプロセスをデバグできます。

% gdb -p 17982
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Attaching to process 17982
Reading symbols from /home/y-araki/test/a.out...(no debugging symbols found)...done.
Reading symbols from /usr/lib64/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x0000003fdaeacb70 in __nanosleep_nocancel () from /lib64/libc.so.6
(gdb)

gdbをオプションなしで起動し、attachコマンドでプロセスIDを指定する方法でも同じです。

# gdb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 17982
Attaching to process 17982
Reading symbols from /home/y-araki/test/a.out...(no debugging symbols found)...done.
Reading symbols from /usr/lib64/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x0000003fdaeacb70 in __nanosleep_nocancel () from /lib64/libc.so.6
(gdb)

この状態でbtを実行すれば、バックトレースが表示されます。

(gdb) bt
#0  0x0000003fdaeacb70 in __nanosleep_nocancel () from /lib64/libc.so.6
#1  0x0000003fdaeaca00 in sleep () from /lib64/libc.so.6
#2  0x000000000040087e in main ()

あとはgdbのコマンドを使って、色々制御することができます。

なお、gdbの起動直後(またはattach直後)、プログラムは停止した状態になるので、プログラムを再開させたい場合は"c"または"continue"を実行します。

(gdb) continue
Continuing.

再開後、gdbで制御したい場合は"Ctrl-c"でプラグラムを一旦停止させてください。

^C
Program received signal SIGINT, Interrupt.
0x0000003fdaeacb70 in __nanosleep_nocancel () from /lib64/libc.so.6
(gdb)

これで再びgdbで制御できます。

Comments [0] | Trackbacks [0]

Movable Type7でアイテムのリネーム規則を変更する「AssetRenameChangerプラグイン」

November 16,2018 12:03 AM
Category:[アップロード]
Tag:[AssetRenameChanger, MovableType, Plugin]
Permalink

Movable Type7でアイテムのリネーム規則を変更する「AssetRenameChangerプラグイン」を公開します。

1.はじめに

MT7のアイテムアップロードで同名のファイル名が存在する場合、次の3パターンから選択できます。

  • 既存のファイルを残して、別のファイル名でアップロードする
  • 既存のファイルを上書きする
  • アップロードしない

「既存のファイルを残して、別のファイル名でアップロードする」を選択して同名のファイルをアップロードした場合、ファイル名はsha1のダイジェスト値を元にした、いわゆるランダムな文字列となります。

たとえば、test.pngというファイルをアップロードしたあと、同じファイルをアップロードすると、ファイル名は下のような文字列になります。

実体のファイル名だけが変更され、アイテムの名前自体は元のファイル名になるので管理上、支障はないと思いますが、実体のファイル名を分かりやすくしたい場合、本プラグインを適用することで、元ファイル名の後方にタイムスタンプを付与するように変更します。

タイムスタンプを付与

2.プラグインのダウンロード・インストール

下記のリンクをクリックして、AssetRenameChangerのプラグインアーカイブをダウンロードします。

AssetRenameChanger_0_01.zip

プラグインアーカイブを展開し、pluginsフォルダにあるAssetRenameChangerフォルダをMovable Typeのアプリケーションディレクトリのpluginsディレクトリにアップロードします。

システム管理画面のプラグイン設定画面で「AssetRenameChanger~」が表示されればインストール完了です。

プラグイン設定画面

Comments [0] | Trackbacks [0]

PDFやWordをGoogleで翻訳する方法

November 14,2018 12:03 AM
Category:[Google]
Tag:[Google, PDF, Word]
Permalink

PDFやWordをGoogleで翻訳する方法を紹介します。

1.問題点

仕事で、PDFの仕様書(英文)を読まないといけなくなりました。膨大なページ数です。

英文

テキストをコピー&ペーストでGoogle翻訳するのは面倒なのでまとめて翻訳したいのですが、方法が分かりません。

ということで、PDFやWordのファイルをGoogleで翻訳する方法を紹介します。

2.PDFやWordのファイルをGoogleで翻訳する

PDFやWordのファイルをGoogleで翻訳するには、Google翻訳のページにアクセスして
「ドキュメントを翻訳」をクリック。

参照

「参照」(Chromeは「ファイルを選択」)をクリック。

ドキュメントを翻訳

ファイルを選択し、「開く」をクリック。

ファイルを選択

元の言語を「英語」、翻訳言語を「日本語」にして「翻訳」をクリック。

翻訳

これで翻訳した文書が表示されます。

英文

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages