問題タブ [glibc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
hook - LD_PRELOAD メソッドを使用して printf に注入する際の問題
プロジェクトの 1 つで glibc の printf() をハッキングしていて、問題が発生しました。手がかりを教えてください。私の懸念の 1 つは、malloc/free の同じソリューションが完璧に機能する理由です。
添付の「PrintfHank.c」には、標準ライブラリの前にプリロードされる独自の printf() ソリューションが含まれています。「main.c」はprintf()を使って文章を出力するだけです。2 つのファイルを編集した後、次のコマンドを発行しました。
- main.c をコンパイル gcc –Wall –o main main.c
- 独自のライブラリを作成 gcc –Wall –fPIC –shared –o PrintfHank.so PrintfHank.c –ldl
- 新しいライブラリをテストします LD_PRELOAD=”$mypath/PrintfHank.so” $mypath/main
しかし、コンソールで「自分のprintf内」ではなく「hello world」を受け取りました。malloc/free 関数をハッキングする場合は問題ありません。
システムに「root」としてログインし、2.6.23.1-42.fc8-i686 を使用しています。どんなコメントでも大歓迎です!!
main.c
PrintfHank.c
c++ - C++のメモリ割り当てと削除に関する質問
悪いエラーが発生します。オブジェクト階層の最上位にあるオブジェクトに対してdeleteを呼び出すと(子オブジェクトが削除されることを期待して)、プログラムが終了し、次のようになります。
続いて、ある種のメモリダンプのように見えます。私はこのエラーを検索しましたが、私が収集したものから、すでに削除されているメモリを削除しようとすると発生するようです。この削除を試みるコードには1つの場所しかないため、不可能です。ここに奇妙な部分があります:それはデバッグモードでは発生しません。問題のコード:
p>ハイトマップデストラクタのすべてをコメントアウトしましたが、それでもこのエラーが発生します。エラーが発生した場合、
印刷されます。デバッグモードでは、コードをゆっくりとステップスルーできます。
が印刷され、エラーはありません。'ハイトマップの削除;'をコメントアウトすると 行、エラーは発生しません。上記のデストラクタは、別のデストラクタから呼び出されます(個別のクラス、仮想デストラクタなどはありません)。ハイトマップポインタは、次のようなメソッドで新しく追加されました。
p>静的メソッドのスタックスペースで初期化されたポインタを返すことと関係があるのでしょうか?削除は正しく行っていますか?私がチェックしたり、より良くしたりできることに関する他のヒントはありますか?
sockets - inet_ntoa が非再入可能関数として設計されているのはなぜですか?
GNU C ライブラリのソース コードをちらりと見てみると、inet_ntoa が次のように実装されていることがわかりました。
私の質問は、reentrant inet_ntoa を使用する必要があるのに、GNU C Library の作成者が malloc を使用して実装しないのはなぜですか?
ありがとう。
c - GCC の strlen() の実装はどこにありますか?
strlen()
誰かがGCCでの定義を教えてもらえますか? 私はリリース 4.4.2 を約 30 分間 grep してきましたが (Google は狂ったように)、strlen()
実際に実装されている場所を見つけることができないようです。
c - gchar** を返す C 関数の問題
次のように定義された関数があります(Cで):
次のような新しい条件を switch ステートメントに追加しようとしています。
&FileTag->artist の最初の文字を返します。
私は解決策を探してインターネット全体を精査しましたが、手ぶらで出てきました。誰にもアイデアはありますか?
更新:
役立つ場合、この機能はアプリケーション EasyTag の一部です。コードを調べたところ、ここで easytag のファイル ソート機能の新しいファイル名が決定されます。次のように、アプリケーションが音楽をディレクトリに並べ替えることができるように、新しい変数を追加しようとしています。<First letter of artist name>/<Artist>/<Album>/<Tracks>
私が間違った関数を見ている可能性は常にありますが、私の知る限りではそうです。
別の更新: この関数は思い通りに動作しました (ポインターは面白い小さなものです)。すべての助けと忍耐に感謝します!
c - printfは私のプログラムを遅くします
ハッシュを計算するための小さなCプログラムがあります(ハッシュテーブル用)。コードはかなりきれいに見えるといいのですが、それとは関係のない何かが私を悩ませています。
約0.2〜0.3秒で約100万のハッシュを簡単に生成できます(/ usr / bin / timeでベンチマーク)。ただし、forループでそれらをprintf()すると、プログラムの速度が約5秒に低下します。
- どうしてこれなの?
- それを速くする方法は?mmapp()ing stdout多分?
- これに関してstdlibcはどのように設計されていますか?また、どのように改善できますか?
- カーネルはどのようにそれをより良くサポートできますか?ローカルの「ファイル」(ソケット、パイプなど)のスループットを本当に高速にするには、どのように変更する必要がありますか?
興味深く詳細な返信を楽しみにしています。ありがとう。
PS:これはコンパイラ構築ツールセット用なので、恥ずかしがらずに詳細を確認してください。それは問題自体とは何の関係もありませんが、私はその詳細が私に興味を持っていることを指摘したかっただけです。
補遺
私は解決策と説明のためのよりプログラム的なアプローチを探しています。確かに、配管はその仕事をしますが、私は「ユーザー」が何をするかを制御できません。
もちろん、私は現在テストを行っていますが、これは「通常のユーザー」では実行されません。しかし、それは単純なprintf()がプロセスを遅くするという事実を変えません。これは、私が最適なプログラムによる解決策を見つけようとしている問題です。
補遺-驚くべき結果
参照時間は、TTY内のプレーンなprintf()呼び出しの場合で、約4分20秒かかります。
/ dev / pts(Konsoleなど)でテストすると、出力が約5秒に高速化されます。
テストコードでsetbuffer()を使用して16384のサイズにすると、ほぼ同じ時間がかかります。8192でもほぼ同じで、約6秒です。
setbuffer()は、それを使用しても明らかに効果がありません。同じ時間がかかります(TTYでは約4分、PTSでは約5秒)。
驚くべきことに、TTY1でテストを開始してから、別のTTYに切り替えると、PTSの場合とまったく同じように約5秒かかります。
結論:カーネルは、アクセシビリティと使いやすさに関係する何かをします。は!
通常、アクティブな状態でTTYを見つめたり、別のTTYに切り替えたりしても、同じように遅くなります。
レッスン:出力を多用するプログラムを実行する場合は、別のTTYに切り替えてください。
gcc - GLIBCXX_3.4.9 が見つかりません
に関して問題がありlibstdc++.so
ます。
新しいバージョンの gcc をインストールし、C++ コードをコンパイルしようとしました。コンパイルは機能しましたが、バイナリ (m5.opt
はその名前) を実行しようとすると、次のエラーが発生しました。
交換する必要がありlibstdc++.so
ますか? その場合、必要なバージョンをどこでダウンロードできますか? GCC Web サイトでは、libstdc++ は現在 gcc の一部であると書かれています。
詳細
GCC: 以前は gcc 4.1.2 を使用していましたが、gcc 4.2.4 をダウンロードしました。私が実行した展開されていないgccディレクトリから./configure
; 作る; sudo make install`. gcc または g++ を使用してコンパイルしようとしたとき、デフォルトのバージョンはまだ 4.1.2 でした。これを克服するために、いくつかのリンクを置き換えました。
GLIBC(++) -- libstdc++:
Linux バージョン: 以下
を提供しuname -a
ます:
Linux madmax 2.6.18-128.4.1.el5 #1 SMP Tue Aug 4 12:51:10 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
linux - クラッシュしたプログラムにその場でgdbを接続するために、誰かがlibsegfault.soとgdbserverを統合したかどうかを誰かが知っていますか?
以前はhttp://sourceware.org/ml/gdb/2007-06/msg00360.htmlで言及されていました。
しかし、実際にこの種のアイデアを実装した人はいないようです。
これを実現する上での障害はありますか?
私の要件は次のとおりです。
- 任意のelfバイナリ実行可能ファイルにプラグインできること(たとえば、LD_PRELOADを使用して)
- バイナリはマルチスレッドの実行可能ファイルである可能性があります
- バイナリは、メイン関数を含むライブラリにリンクする場合があります
- これは、x86以外のさまざまなCPUアーキテクチャ(少なくともMIPS、ARM、PPC)で機能するはずです。
したがって、このような解決策がすでにある場合はリンクが必要でしたが、まだない場合は、なぜそれがまだホイールとして実装されていないのかを知りたいと思いました。
誰もそれを必要としなかったというだけかもしれませんが…でも、これは標準として準備するのにとても便利だと思います。
コードをまとめる以外の技術的または政治的な問題が求められています。
c - スレッドセーフな方法でglibcmallocフックを使用する
mallocとfreeフックを使用して、アプリケーションでのmallocとfreeの使用を監視したいと思います。
これがドキュメントですhttp://www.gnu.org/s/libc/manual/html_node/Hooks-for-Malloc.html
my_malloc_hook
サンプルページから、mallocを再度呼び出す前に、mallocフックを一時的にオフ(またはチェーン内の前のフック)に切り替えることがわかります。
これは、マルチスレッドアプリケーションを監視する場合の問題です(説明については、質問の最後を参照してください)。
私がインターネットで見つけたmallocフックの使用の他の例にも同じ問題があります。
マルチスレッドアプリケーションで正しく機能するようにこの関数を書き直す方法はありますか?
たとえば、mallocフックが呼び出すことができる内部libc関数があり、フックを非アクティブ化する必要なしに、割り当てを完了します。
会社法上の理由でlibcのソースコードを見ることができないので、答えは明らかかもしれません。
私の設計仕様では、mallocを別のmalloc設計に置き換えることはできません。
他のフックは機能していないと推測できます。
アップデート
mallocのサービス中にmallocフックが一時的に削除されるため、別のスレッドがmallocを呼び出し、フックを取得できない場合があります。
これが起こらないようにmallocの周りに大きなロックがあることが示唆されていますが、それは文書化されていません。また、mallocを効果的に再帰的に呼び出すという事実は、フックの後にロックが存在するか、または愉快に賢くなければならないことを示唆しています。