DockerでGDBを使用するときにブレークポイントを入力できない問題を解決する

DockerでGDBを使用するときにブレークポイントを入力できない問題を解決する

質問

docker で gdb を実行すると、ブレークポイントに到達しますが、ブレークポイントに入ることができません

理由

ホストのセキュリティを確保するために、Docker では、ASLR (アドレス空間レイアウトのランダム化) を含む多くのセキュリティ設定が有効になっています。つまり、Docker 内のメモリ アドレスはホストのメモリ アドレスとは異なります。

ASLR により、GDB などのアドレス依存プログラムが正しく動作しなくなります。

回避策

dockerのスーパー権限を使用し、--privileged(2つのダッシュ、マークダウン構文)を追加します

のように:

docker run --privileged …

GDBは正常に動作します

スーパー権限により多くのセキュリティ設定が無効になり、Dockerの機能を最大限に活用できるようになります。

たとえば、docker で docker を開くことができます(笑)。

追加知識: docker ptrace: 操作は許可されていません。対処方法

docker の gdb がプロセスをデバッグしているときに、エラーが報告されます。

(gdb) アタッチ 30721

プロセス30721に接続中

ptrace: 操作は許可されていません。

その理由は、Docker では ptrace がデフォルトで無効になっているためです。アプリケーション分析のニーズを考慮すると、いくつかのソリューションがあります。

1. seccompをオフにする

docker run --security-opt seccomp=unconfined

2. スーパー権限モードを使用する

docker run --privileged

3. ptrace制限のみを開く

docker run --cap-add sys_ptrace

もちろん、セキュリティの観点から、デバッグにのみ gdb を使用する場合は、3 番目の方法を使用することをお勧めします。

セキュア コンピューティング モード (seccomp) は、コンテナー内で利用可能な操作を制限するために使用できる Linux カーネルの機能です。

Docker のデフォルトの seccomp プロファイルは、許可される呼び出しを指定するホワイトリストです。

次の表には、ホワイトリストに含まれていないために事実上ブロックされている重要な(ただしすべてではない)システム コールがリストされています。この表には、各システム コールがブロックされた理由が記載されています。

システムコール説明
アカウントコンテナが独自のリソース制限やプロセス アカウンティングを無効にできるようにするアカウンティング システムコール。CAP_SYS_PACCT によっても制御されます。
キーを追加コンテナが名前空間化されていないカーネル キーリングを使用しないようにします。
アジタイムックスclock_settime および settimeofday と同様に、time/date は名前空間化されていません。また、CAP_SYS_TIME によって制御されます。
bpf CAP_SYS_ADMIN によって既に制限されている、潜在的に永続的な bpf プログラムをカーネルにロードすることを拒否します。
時計調整時間時刻/日付は名前空間化されていません。CAP_SYS_TIME によっても制御されます。
時計の設定時間時刻/日付は名前空間化されていません。CAP_SYS_TIME によっても制御されます。
クローン新しい名前空間の複製を拒否します。CLONE_USERNS を除く CLONE_* フラグについては、CAP_SYS_ADMIN によっても制御されます。
モジュールの作成カーネル モジュールの操作と機能を拒否します。廃止されました。CAP_SYS_MODULE によっても制御されます。
モジュールの削除カーネル モジュールに対する操作と機能を拒否します。CAP_SYS_MODULE によっても制御されます。
有限モジュールカーネル モジュールに対する操作と機能を拒否します。CAP_SYS_MODULE によっても制御されます。
カーネルシンボルを取得するエクスポートされたカーネルお​​よびモジュール シンボルの取得を拒否します。廃止されました。
get_mempolicyカーネル メモリと NUMA 設定を変更するシステム コール。CAP_SYS_NICE によってすでにゲートされています。
初期化モジュールカーネル モジュールに対する操作と機能を拒否します。CAP_SYS_MODULE によっても制御されます。
イオパームコンテナがカーネル I/O 特権レベルを変更するのを防ぎます。CAP_SYS_RAWIO によって既にゲートされています。
ioplコンテナがカーネル I/O 特権レベルを変更するのを防ぎます。CAP_SYS_RAWIO によって既にゲートされています。
ケーエムピーCAP_PTRACE を削除することですでにブロックされているプロセス検査機能を制限します。
kexec_file_load kexec_load の姉妹システムコールで、同じことを行いますが、引数が若干異なります。CAP_SYS_BOOT によってもゲートされます。
kexec_load後で実行するために新しいカーネルをロードすることを拒否します。CAP_SYS_BOOT によっても制御されます。
キーコントロールコンテナが名前空間化されていないカーネル キーリングを使用しないようにします。
ルックアップクッキートレース/プロファイリング システムコール。ホスト上で大量の情報が漏洩する可能性があります。CAP_SYS_ADMIN によってもゲートされます。
バインドカーネル メモリと NUMA 設定を変更するシステム コール。CAP_SYS_NICE によってすでにゲートされています。
マウントマウントを拒否します。CAP_SYS_ADMIN によってすでにゲートされています。
ページを移動カーネル メモリと NUMA 設定を変更するシステム コール。
ハンドル名open_by_handle_at の姉妹システムコール。CAP_SYS_NICE によってすでにゲートされています。
nfsservctlカーネル nfs デーモンとのやり取りを拒否します。Linux 3.1 以降では廃止されました。
ハンドルで開く古いコンテナのブレークアウトの原因。CAP_DAC_READ_SEARCH によってもゲートされます。
パフォーマンスイベントオープントレース/プロファイリング システムコール。ホスト上で大量の情報が漏洩する可能性があります。
人格コンテナが BSD エミュレーションを有効にしないようにします。本質的に危険ではありませんが、テストが不十分で、多くのカーネル脆弱性が発生する可能性があります。
ピボットルートpivot_root を拒否します。特権操作である必要があります。
プロセス_vm_readv CAP_PTRACE を削除することですでにブロックされているプロセス検査機能を制限します。
プロセス_vm_writev CAP_PTRACE を削除することですでにブロックされているプロセス検査機能を制限します。
ptraceトレース/プロファイリング システムコール。ホスト上で大量の情報が漏洩する可能性があります。CAP_PTRACE を削除することで既にブロックされています。
クエリモジュールカーネル モジュールに対する操作と機能を拒否します。廃止されました。
引用コンテナーが独自のリソース制限やプロセス アカウンティングを無効にできるようにするクォータ システムコール。CAP_SYS_ADMIN によっても制御されます。
リブートコンテナがホストを再起動しないようにします。CAP_SYS_BOOT によっても制御されます。
リクエストキーコンテナが名前空間化されていないカーネル キーリングを使用しないようにします。
メモリポリシーの設定カーネル メモリと NUMA 設定を変更するシステム コール。CAP_SYS_NICE によってすでにゲートされています。
セットスレッドと名前空間の関連付けを拒否します。CAP_SYS_ADMIN によっても制御されます。
日時を設定する時刻/日付は名前空間化されていません。CAP_SYS_TIME によっても制御されます。
ソケット、ソケットコールパケットの送受信、およびその他のソケット操作に使用されます。通信ドメイン AF_UNIX、AF_INET、AF_INET6、AF_NETLINK、および AF_PACKET を除くすべてのソケットおよびソケットコール呼び出しはブロックされます。
時間時刻/日付は名前空間化されていません。CAP_SYS_TIME によっても制御されます。
スワポンファイル/デバイスへのスワップの開始/停止を拒否します。CAP_SYS_ADMIN によっても制御されます。
スワップオフファイル/デバイスへのスワップの開始/停止を拒否します。CAP_SYS_ADMIN によっても制御されます。
sysfs廃止されたシステムコール。
_sysctl廃止され、/proc/sys に置き換えられました。
アンマウント特権操作である必要があります。CAP_SYS_ADMIN によっても制御されます。
アンマウント2特権操作である必要があります。CAP_SYS_ADMIN によっても制御されます。
共有解除プロセスの新しい名前空間の複製を拒否します。unshare –user を除き、CAP_SYS_ADMIN によっても制御されます。
使用ライブラリ長い間使用されていない、共有ライブラリに関連する古いシステムコール。
ユーザーフォールトユーザー空間のページ フォールト処理。主にプロセスの移行に必要です。
ユースタット廃止されたシステムコール。
86さんカーネル x86 リアル モード仮想マシン。CAP_SYS_ADMIN によっても制御されます。
翻訳者カーネル x86 リアル モード仮想マシン。CAP_SYS_ADMIN によっても制御されます。

上記のdockerでGDBを使用するときにブレークポイントを入力できない問題を解決する記事は、エディターが皆さんと共有する内容のすべてです。 皆さんの参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerサーバーのストレージリソースプール不足問題の解決
  • docker runの--rmオプションの使用方法
  • docker-compose が遅すぎる場合の解決策の詳細な説明

<<:  Sysbench の MySQL ベンチマーク プロセスの分析

>>:  HTML iframe と frameset の違い_PowerNode Java Academy

推薦する

HTMLのタグについての簡単な説明

0. タグとは何ですか? XML/HTML コードコンテンツをクリップボードにコピー<入力 t...

Linux カーネルの copy_{to, from}_user() に関する考察

目次1. copy_{to,from}_user() とは何か1. copy_{to,from}_u...

使用状況分析を備えたMySQL

持つことの使用法having 句を使用すると、グループ化後にさまざまなデータをフィルター処理できます...

Linux ifconfig コマンドの使用

1. コマンドの紹介ifconfig (ネットワーク インターフェイスを構成する) コマンドは、ネッ...

...

Dockerにおけるコンテナとイメージの違いについてお話ししましょう

鏡とは何ですか?イメージは、複数のイメージ レイヤー (UnionFS および AUFS ファイル ...

Vue プロジェクトでよく使用されるツール機能の概要

目次序文1. カスタムフォーカスコマンド1. 方法1 2. 方法2 3. 方法3 2. 入力ボックス...

ウェブインターフェースデザインでウェブサイトのスタイルガイドを作成する方法(画像とテキスト付き)

スタイル ガイドとは何でしょうか? 簡単に言えば、ストーリーを伝える方法を説明するドキュメントです。...

Centos6.5 の rpm パッケージから mysql5.7 をインストールするときに発生する初期化エラーの解決策

1. rzをサーバーにアップロードして解凍する rz [root@mini2 アップロード]# ta...

Vue2.0でデータの双方向バインディング機能をjsを使って実装する

Object.definePropertyの理解文法:オブジェクト.defineProperty(o...

MySQL の「特殊キーが長すぎます」の解決策

目次解決策1解決策2テーブルを作成するときに、興味深い問題に遭遇しました。「指定されたキーが長すぎま...

React+axios は github 検索ユーザー機能を実装します (サンプル コード)

負荷リクエスト成功リクエストに失敗しました cmdをクリックし、ファイルパスでEnterキーを押しま...

jQueryはクッキーを操作する

コードをコピーコードは次のとおりです。 jQuery.cookie = 関数(名前、値、オプション)...

MySQL データベースの最適化に関する 9 つのヒント

目次1. 最も適切なフィールド属性を選択する2. フィールドをNOT NULLに設定してみる3. サ...

iOS、Android、ミニプログラムアプリの敷居の低い開発のためのフロントエンドフレームワークを詳しく解説

現在、クロスプラットフォーム開発技術はもはや新しい話題ではありません。市場にはいくつかのオープンソー...