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

推薦する

CSSメディアクエリのアスペクト比を小さくする方法

CSS メディア クエリには非常に便利なアスペクト比、aspect-ratio があり、幅と高さを直...

jQuery はシャッター効果を実現します (li 配置を使用)

この記事では、ブラインド効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具体...

Centos7でのSambaサーバー構成(実戦)

サンバの概要Samba は、Linux および UNIX システム上で SMB プロトコルを実装する...

JavaScript のクロージャの詳細な説明

導入クロージャは JavaScript の非常に強力な機能です。いわゆるクロージャは関数内の関数です...

Vueはタブを切り替えてデータの状態を維持する3つの方法を実装します

Vue でタブ切り替えを実装する 3 つの方法1. v-showはコンテンツの切り替えを制御します1...

進捗バー効果を実現するJavaScript

この記事では、プログレスバー効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

Docker Composeを使用してDOCleverをインストールする詳細なプロセスを説明します

目次1. Docker Composeとは何か、インストールして使用する方法2. DOCleverと...

Mysql WorkBench のインストールと設定のグラフィックチュートリアル

この記事では、Mysql WorkBenchのインストールと設定のグラフィックチュートリアルを参考ま...

Flex プログラム Firefox で中国語を入力すると文字化けするバグ

Firefox の下位バージョンでは中国語の文字を入力できず、上位バージョンでは文字化けした文字が表...

mysql バックアップ戦略の実装 (フルバックアップ + 増分バックアップ)

目次設計シナリオ技術的なポイントサーバー情報準備フルバックアップスクリプト(Mysql-FullyB...

MySQLデータベースを誤って削除した後にデータを回復するための手順

日々の運用・保守作業において、MySQL データベースのバックアップは重要です。ウェブサイトにとって...

Ubuntu でパスワードを変更し、パスワードの複雑さのポリシーを設定する方法

1. パスワードを変更する1. 一般ユーザーのパスワードを変更する パスワード現在のパスワードを入力...

CSS3 でクールなスライス画像カルーセル効果を実現

今日は、CSS を使用してクールな画像カルーセル コンポーネントを作成する方法を学びます。その原理は...

JSインターセプト文字列の3つの方法の詳細な説明

JS には、文字列をインターセプトするための 3 つのメソッド、 slice() 、 substri...

Docker イメージに基づいて Go プロジェクトをデプロイする方法と手順

知識への依存Go クロスコンパイルの基礎Dockerの基礎Dockerfileカスタムイメージの基本...