2009-11-14 11 views
16

OSXでXcodeを使用してコマンドラインCアプリケーションを開発しています。また、Instrumentsを使用してプロファイルを作成し、メモリリークを見つけたいと思っています。インストーラを使用してコマンドラインアプリケーションでコンソールを表示する

しかし、Instruments内からアプリケーションを起動するときにコンソールを表示する方法が見つかりませんでした。ここで私は楽器を起動した後に得たエラーだ

#include <stdio.h> 
#include <signal.h> 
#include <stdlib.h> 
#include <setjmp.h> 

static sigjmp_buf jmpbuf; 

void handler(int sig) { 
    char c[BUFSIZ]; 

    printf ("Got signal %d\n", sig); 
    printf ("Deseja sair? (s/n) "); 

    fgets(c, sizeof(c), stdin); 

    if(c[0] == 's') { 
     exit(0); 
    } else { 
     siglongjmp(jmpbuf, 1); 
    } 
} 

int main(void) { 
    char buf[BUFSIZ]; 

    signal(SIGINT, handler); 

    sigsetjmp(jmpbuf, 1); 

    while(1) { 
     printf(">>>"); 
     fgets(buf, sizeof(buf), stdin); 
     printf ("Introduziu: %s\n", buf); 
    } 

    return(0); 
} 

、および添付しようとしている:ここではサンプルコードがあります

:私は(それがエラーで終了)も、実行中のコマンド・ライン・プロセスにアタッチすることができませんでしよxcodeの実行中のプロセスに:

[Switching to process 1475] 
[Switching to process 1475] 
Error while running hook_stop: 
sharedlibrary apply-load-rules all 
Error while running hook_stop: 
Invalid type combination in ordering comparison. 
Error while running hook_stop: 
Invalid type combination in ordering comparison. 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 
Error while running hook_stop: 

Unable to disassemble __CFInitialize. 

どのような考えですか?

答えて

17

簡単です。スクリーンショットを参照してください。

screenshot

4

答えはthis questionを参照してください。その中のブラッド・ラーソンから

は、コンソール出力がパイプ持ってXcodeの中からアプリケーションを実行します。アプリケーションが起動している状態で、Instrumentsを起動し、適切な機器を選択します。メニューバーの「デフォルトターゲット」で、iPhoneまたはコンピュータ(テストするものに適したもの)を選択し、「プロセスにアタッチ」の下で実行可能ファイルの名前を探します。

[録音]ボタンをクリックすると、コンソール出力がXcodeに向けられた状態で、Instrumentsのアプリケーションのプロファイリングが開始されます。残念ながら、このアタッチプロセスはアプリケーションの起動後に行う必要があるため、アプリケーションの起動を別々にプロファイルする必要があります。

編集:これでうまくいかない場合は、コンピュータを再起動するだけで済みます。あなたはまだそれをしましたか?

+0

私はそれを試みましたが、失敗しました。私の変更された質問を見てください。どうも。 –

+0

再起動について:ただし、コース_:D –

2

ターゲットを選択するときに[オプション]ドロップダウンで出力を変更できます。出力はシステムコンソール(アプリケーション/ユーティリティ/コンソール)に表示されます。

IO options

+0

これは違いはありません。 – trojanfoe

+1

端末から計測器を起動すると動作します(コンピュータ上で/ Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/MacOS/Instruments'を実行します)。これを行い「システムコンソール」を選択すると、出力が得られます。 – cobbal

+0

私は端末から起動すると何も得られません。出力もGUIもGUIもありません。 –

15

しかし、私は、コマンドラインユーティリティをプロファイリングする最良の方法は、iprofilermanpage)を使用することで発見した、この古いスレッドに貢献して少し遅れてです。これは、データが単純にコマンドラインの先頭にこれを追加することで、コマンドラインから収集することができます:

iprofiler -leaks -d $HOME/tmp 

(私は$HOME/tmpでプライベート一時ディレクトリを持っているので、あなたが/tmpを使用するか、-dを残すために必要がある場合がありますコマンドラインオプションをオフにする)。

私のテストスクリプトでは、$FINDLEAKSが定義されている場合、自動的にそのスクリプトがコマンドラインに追加されます(Linuxの場合はvalgrindとなります)。

これは、Instrumentsを使用してロードしてアナライズすることができる.dtpsファイル(実際にはディレクトリ)を生成します。

あなたはclangを使用してコンパイルする場合、単に(打ち鳴らす-pgコマンドラインオプションをサポートしていません)-O3-gの両方を追加します。

関連する問題