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

推薦する

JSは写真の自動再生効果を実現します

この記事では、写真の自動再生効果を実現するためのJSの具体的なコードを参考までに紹介します。具体的な...

Reactでのイベントバインディングの実装は3つの方法を指しています

1. 矢印関数1. 矢印関数自体はこれをバインドしないという事実を利用します。 2. render(...

JS ES 新機能テンプレート文字列

目次1. テンプレート文字列とは何ですか? 2. 複数行のテンプレート文字列2.1 式付きテンプレー...

jQueryで劇場の座席選択と予約の効果を実現

jQueryは劇場の座席選択と予約の効果を実現します。参考までに、具体的な内容は次のとおりです。効果...

CSSプリコンパイル言語とその違いの詳細な説明

1. 何ですか マークアップ言語として、CSSは比較的シンプルな構文とユーザーに対する要件が低いが、...

ウェブサイトにファビコンを追加するためのヒント: URLの前の小さなアイコン

いわゆるファビコンは、Favorites Icon の略で、中国語ではウェブサイトアバターと呼ばれて...

JS配列インデックス検出におけるデータ型の問題の詳細な説明

WeChat アプレット プロジェクトを書いていたとき、その中に「都市選択」機能がありました。作者は...

Alibaba Cloud SSHリモート接続がしばらくすると切断される問題を解決

問題の再現Alibaba Cloud Server は、Finalshell リモート接続を使用して...

nginx の場所に複数の Proxy_pass メソッドがある

1. まず、nginxの位置情報に関する関連知識を確認しましょう1) 位置マッチング手順: ~ #波...

集める価値のある 15 個の JavaScript 関数

目次1. 数字を逆にする2. 配列内の最大のn個の数値を取得する3. 階乗を計算する4. 現在の動作...

PostgreSQL マテリアライズドビュープロセス分析

この記事は主にPostgreSQLマテリアライズドビューのプロセス分析について紹介します。サンプルコ...

複数の X 軸を使用して 7 日間の天気予報を実現するための Echarts サンプル コード

目次UIデザインEcharts の例の効果序文サンプルコード最終結果UIデザイン Echarts の...

js メモリ リークのシナリオ、それらを詳細に監視および分析する方法

目次序文どのような状況でメモリリークが発生する可能性がありますか? 1. 偶発的なグローバル変数2....

Google の新しい UI から学べること (画像とテキスト)

2011 年に最も顕著なウェブサイトの変更は、一連の製品に新しいユーザー インターフェースを導入した...

Vueのref属性の詳細な説明

要約するこの記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS....