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

推薦する

IE ラベル LI テキスト折り返し問題について

私は長い間この問題に悩まされていましたが、検索してみたところ、実際にこの問題を解決した人がいることが...

MySQLのネクストキーロックのロック範囲についての簡単な説明

序文ある日、突然 MySQL の次のキー ロックについて尋ねられ、私の即座の反応は次のようなものでし...

Day.js をベースにした JavaScript での日付処理のよりエレガントな方法

目次day.js を使用する理由モーメントデイ.js day.js がなければどうなるでしょうか? ...

HTML フォーム コントロールの無効な属性の読み取り専用と無効の概要

HTML でフォームの送信を無効にする方法は 2 つあります。 1. コントロールタグにreadon...

Windows 上で Nginx+Tomcat クラスタを実装するプロセスの分析

導入: Nginx (エンジン エックスと同じ発音) は、BSD のようなプロトコルに基づいてリリー...

Vue ページをリフレッシュするために provide と injection を適用する

目次方法1: 関数を直接呼び出す方法2: provide / inject (静的更新) を使用する...

mysql data_dirの変更によって発生するエラー問題を解決する

今日は、新しく購入した Alibaba Cloud ECS 環境 (Ubuntu 16.04 LTS...

Mac に MySQL データベースをインストールし、環境変数を設定するためのグラフィック チュートリアル

目次MySQLをインストールする環境変数の設定MySQLをインストールするmysqlをダウンロードし...

CSS ワールド - コード実践: 画像の Alt 情報の表示

ただし、デフォルトの src を持つ <img> 要素を使用してスクロール読み込み効果を...

Docker が PostgreSQL を起動するときに複数のデータベースを作成するためのソリューション

1 はじめに「DockerでPostgreSQLを起動する方法といくつかの接続ツールのおすすめ」の記...

CSS フレックスレイアウトのリストの最後の行を左揃えにする N 通りの方法 (要約)

張新旭氏の記事を引用して皆さんにシェアしたいと思います。 変更を加えたい場合は、対応する画像によって...

MySQL 5.7.21 解凍版のインストールと設定方法のグラフィックチュートリアル

私は頻繁にシステムをインストールするので、インストールのたびにいくつかのソフトウェアを再インストール...

SQL 集計、グループ化、並べ替え

目次1. 集計クエリ1. COUNT関数2. SUM関数3. AVG関数4. MAX関数とMIN関数...

JavaScript クロージャの説明

目次1. クロージャとは何ですか? 1.2 クロージャのメモ化: 関数は定義された環境を記憶する1....

JQuery を放棄すべきでしょうか?

目次序文jQuery 以外の場合は何を使うのでしょうか? DOMとイベントAJAX リクエスト要約す...