gdbを一時停止/強制停止させる方法

November 15,2017 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

gdbを一時停止/強制停止させる方法を紹介します。

1.問題点

次のサンプルプログラムを作りました。

test.cpp

#include <iostream>
#include <unistd.h>
 
int main() {
    int i;
    int j = 0;
    for (i = 0; i < 10000; i++ ) {
        std::cout << "OK" << std::endl;
        sleep(1);
        j++;
    }
    return 0;
}

このプログラムをgdbで実行させたあと、プログラムを一旦停止させてからブレークポイントを設定したいのですが、方法が分かりません。

ということで、gdbを一時停止/強制停止させる方法を紹介します。

2.gdbを一時停止/強制停止させる

gdbを一時停止/強制停止させるには、"Ctrl-c"を利用します。

gdbでプロセスが動作しているときに"Ctrl-c"を入力すると、制御がgdbに移るので、この状態でブレークポイントを設定することができます。

前述のサンプルでの手順を下記に示します。

まずビルドします。

# g++ -g test.cpp

gdbでプログラムを起動します。

# gdb ./a.out
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
Copyright (C) 2013 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 "ppc64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/foo/a.out...done.

実行します。

(gdb) run
Starting program: /home/foo/./a.out
OK
OK
OK

ここでCtrl-cを入力します。

^C
Program received signal SIGINT, Interrupt.
0x00003fffb7b74dc8 in __nanosleep_nocancel () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7.ppc64 libgcc-4.8.5-11.el7.ppc64 libstdc++-4.8.5-11.el7.ppc64

プロセスが停止してgdbに制御が戻ってプロンプトが表示されるので、ブレークポイントを設定します。

(gdb) break test.cpp:10
Breakpoint 1 at 0x100009e0: file test.cpp, line 10.

再開させるには"continue"を入力。

(gdb) continue
Continuing.
 
Breakpoint 1, main () at test.cpp:10
10              j++;

ブレークポイントで停止したのでjの値を表示させます。

(gdb) print j
$1 = 2
Comments [0] | Trackbacks [0]

Linuxで実行中プロセスのフルパスを取得する方法

November 9,2017 12:03 AM
Category:[Linux]
Tag:[Linux]
Permalink

Linuxで実行中プロセスのフルパスを取得する方法を紹介します。

1.問題点

Linuxサーバをシャットダウン→再起動したあと、httpdを起動させたのですが、アクセスしたページが「Not Found」になってしまいました。

おそらくApacheが複数インストールされていて、いつも使っていないバイナリを起動させてしまったようです。

いくつかあるうちのどれかを起動すれば解消すると思います。

で、色々試しているうちに解消したのですが、結局どのhttpdが起動しているのか分からなくなりました。

psコマンドでは次のような相対パス表示なので絶対パス(フルパス)が分かりません。

# ps -ef |grep httpd
root      3033     1  0 14:24 ?        00:00:00 ./httpd
daemon    3034  3033  0 14:24 ?        00:00:00 ./httpd
daemon    3035  3033  0 14:24 ?        00:00:00 ./httpd
daemon    3036  3033  0 14:24 ?        00:00:00 ./httpd
daemon    3037  3033  0 14:24 ?        00:00:00 ./httpd
daemon    3128  3033  0 14:25 ?        00:00:00 ./httpd
root      3265  2696  0 14:31 pts/1    00:00:00 grep httpd

2.実行中プロセスのフルパスを取得する

実行中プロセスのフルパスを取得するには

/proc/[PID]/exe

を利用します。

前述のpsコマンドでhttpdのプロセスIDは3033なので

/proc/3033/exe

のシンボリックリンクに、実行ファイルのパス(/usr/local/apache2/bin/httpd)が表示されます。

# ls -l /proc/3033/exe
lrwxrwxrwx. 1 root root 0 11月  2 14:32 2017 /proc/3033/exe -> /usr/local/apache2/bin/httpd
Comments [0] | Trackbacks [0]

vimを終了させる方法

November 8,2017 12:03 AM
Category:[Linux]
Tag:[]
Permalink

vimを終了させる方法についてまとめました。

注:いずれも実行前にESCを押下し、コマンドモードに切り替えてください

:q

終了。内容が変更されている場合は「E37: 最後の変更が保存されていません (! を追加で変更を破棄)」というメッセージが表示されます。これは「:quit」の短縮形です。

:q!

変更した内容を保存せず終了。これは「:quit!」の短縮形です。

:wq

書き込み&終了

:wq!

強制書き込み&終了(ファイルに書き込み権限がなくても強制書き込み)

:x

書き込み&終了(「:wq」と同様)

:exit

書き込み&終了(「:wq」と同様)

:qa

すべて終了。内容が変更されている場合は「E162: バッファ "..." の変更は保存されていません」というメッセージが表示されます。これは「:quitall」の短縮形です。

ZZ

書き込み&終了(ファイルに書き込み権限がなくても強制書き込み)

ZQ

終了(内容が変更されている場合でも強制終了)

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