2011年4月12日

[ruby-list:47962] Re: Ruby用のリアルタイムプロファイラ

sora_hです。

2011/4/12 Takahiro Sunaga <sunagae@xxxxx>:
> 現在リアルタイムで動作するRuby用実行時間プロファイラを開発しています。
> まだまだ不安定ではありますが、ある程度使用できるものになりましたので以下
> のページで公開しています。
> http://sunagae.net/software/llprof

さっそく試してみました。

残念ながらOSXで動きません… ;'(

さっそくパッチを書いてみました。添付しておきます。

このパッチを適用することでOSX上で動く気がするんですけどテストコードなどが存在しなさそうなので
ちゃんと動くかは確認できてません。一応monitorからの接続と表示は確認したんですけど。

そして、この修正も間違ってるかもしれないのでいくつかご指摘いただければと思います。

現時点で感じた疑問点はこんな感じ:

・ライセンスは?
・class_table.cppのnull_strとかnullstrは__threadである必要はあるのかどうか分からなかった。

--
Shota Fukumori a.k.a. @sora_h - http://codnote.net/

[osx.diff application/octet-stream (2.8KB)]
diff -r 3289e745236d rrprofext/call_tree.cpp
--- a/rrprofext/call_tree.cpp Wed Apr 06 13:25:17 2011 +0900
+++ b/rrprofext/call_tree.cpp Tue Apr 12 08:56:31 2011 +0900
@@ -183,8 +183,10 @@

ThreadInfo *gFirstThread;
ThreadInfo *gLastThread;
-__thread ThreadInfo *gCurrentThread = NULL;
+//__thread ThreadInfo *gCurrentThread = NULL;
+pthread_key_t threadKey;
pthread_mutex_t gThreadDataMutex = PTHREAD_MUTEX_INITIALIZER;
+#define gCurrentThread ((ThreadInfo*)pthread_getspecific(threadKey))
unsigned long long int gThreadMaxID = 0;

ThreadInfo *get_current_thread()
@@ -192,7 +194,8 @@
if(gCurrentThread != NULL)
return gCurrentThread;
pthread_mutex_lock(&gThreadDataMutex);
- gCurrentThread = new ThreadInfo(gThreadMaxID);
+ //gCurrentThread = new ThreadInfo(gThreadMaxID);
+ pthread_setspecific(threadKey,new ThreadInfo(gThreadMaxID));
gThreadMaxID++;

if(!gLastThread)
@@ -594,6 +597,7 @@
cout << "[Init]" << endl << " pNodes = " << gBackBuffer_SerializedNodeInfoArray << endl;
cout << " pStack = " << gBackBuffer_SerializedStackArray << endl;

+ pthread_key_create(&threadKey,NULL);
get_current_thread();


diff -r 3289e745236d rrprofext/class_table.cpp
--- a/rrprofext/class_table.cpp Wed Apr 06 13:25:17 2011 +0900
+++ b/rrprofext/class_table.cpp Tue Apr 12 08:56:31 2011 +0900
@@ -32,7 +32,7 @@
(st_index_t (*)(...)) clstbl_hash
};

-__thread const char *nullstr = "(null)";
+const char *nullstr = "(null)";
const char *new_str(const char *str)
{
if(!str)
@@ -68,7 +68,7 @@
pthread_mutex_unlock(&mtx_);
}

-__thread const char *null_str = "(ERR)";
+const char *null_str = "(ERR)";
const char * NameTable::Get(Key entry)
{
char *name;
diff -r 3289e745236d rrprofext/rrprof.cpp
--- a/rrprofext/rrprof.cpp Wed Apr 06 13:25:17 2011 +0900
+++ b/rrprofext/rrprof.cpp Tue Apr 12 08:56:31 2011 +0900
@@ -6,6 +6,9 @@
#include <unistd.h>
#include <errno.h>

+#if (defined(__APPLE__) || defined(__NeXT__)) && defined(__MACH__)
+#include <mach/mach_time.h>
+#endif

#include <pthread.h>
#include <sys/types.h>
@@ -19,8 +22,6 @@
#include "call_tree.h"
#include "server.h"

-
-
#define POLLFD_MAX 256


@@ -46,9 +47,19 @@
*/
time_val_t GetNowTime_clock_gettime_monotonic()
{
+ //clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp);
struct timespec tp;
- //clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp);
+#if (defined(__APPLE__) || defined(__NeXT__)) && defined(__MACH__)
+ //gettimeofday(&tp, NULL);
+ static mach_timebase_info_data_t ti = {0,0};
+ if(ti.denom == 0) mach_timebase_info(&ti);
+ uint64_t nano = mach_absolute_time() * (ti.numer / ti.denom);
+
+ tp.tv_sec = nano * 1e-9;
+ tp.tv_nsec = nano - (tp.tv_sec * 1e9);
+#else
clock_gettime(CLOCK_MONOTONIC, &tp);
+#endif

// return (time_val_t)tp.tv_nsec;
return ((time_val_t)tp.tv_sec)*1000*1000*1000 + ((time_val_t)tp.tv_nsec);


投稿者 xml-rpc : 2011年4月12日 09:01
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/103131
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。