忍者ブログ
ちょっとは人のためになる事をしないとインターネットコミュニティーの皆様に申し訳がないかと思いながら、自分の備忘録ていどでしかなく、実際の所たいした情報も提供できないでいるブログ
[1] [2] [3] [4] [5] [6] [7]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

デバッグ時のコマンドライン引数の与え方

Product -> Edit Scheme -> Argument Passed On Launch

PR
Apache再インストール時には apu-1-config に注意。

間違って /usr/local/bin, /usr/bin などに apache をインストールしてしまった場合は、apu-1-config の残骸をきっちり消す事

以下、経緯。

apache 2.2 をインストールしていた。configure の --prefix をまちがえて --prefix=/usr/local として configure, make, make install インストールしたら、/usr/local 下に諸々がインストールされてしまった。まあ、ここまでは、よくある凡ミス。

/usr/local 以下にちらばった apache 関連のファイルを削除し、--prefix=/usr/local/www として再度 configure, make したのだが、make が通らない。コンパイル時に /usr/local/build/libtool という存在しないコマンドが使われてしまう(エラーメッセージは下の方に)。

まちがった "configure --prefix=/usr/local" の影響を受けているな、ってところまでは明白なので、make distclean して再 configure しても状況はかわらない。tarball を開き直しても状況はかわらない。

これは、先に失敗した --prefix=/usr/local の make install で作られた apu-1-config というコマンドが、PATHのかかった /usr/local/bin に残っていて、configure が、このコマンドを使い libtool の位置を特定していたのが原因だった。間違ってインストールしてしまったファイルを削除したつもりが削除しきれいてなかった、ってわけだが、configureで以前のインストールした実行ファイルを使ってしまうとは・・・

エラーメッセージはこんな感じでした。

/usr/local/build/libtool --silent --mode=compile gcc -g -O2 -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -I/home/naoshi/src/httpd-2.2.19/srclib/pcre -I. -I/home/naoshi/src/httpd-2.2.19/os/unix -I/home/naoshi/src/httpd-2.2.19/server/mpm/prefork -I/home/naoshi/src/httpd-2.2.19/modules/http -I/home/naoshi/src/httpd-2.2.19/modules/filters -I/home/naoshi/src/httpd-2.2.19/modules/proxy -I/home/naoshi/src/httpd-2.2.19/include -I/home/naoshi/src/httpd-2.2.19/modules/generators -I/home/naoshi/src/httpd-2.2.19/modules/mappers -I/home/naoshi/src/httpd-2.2.19/modules/database -I/usr/local/include -I/home/naoshi/src/httpd-2.2.19/server -I/home/naoshi/src/httpd-2.2.19/modules/proxy/../generators -I/home/naoshi/src/httpd-2.2.19/modules/ssl -I/home/naoshi/src/httpd-2.2.19/modules/dav/main -c maketables.c && touch maketables.lo
/bin/sh: /usr/local/build/libtool: No such file or directory

Xcode 4 でエラーが起きたとき "Issue Navigator" にエラーが表示され、ソースコードにエラーメッセージが赤字で表示されるが、いずれも表示領域が小さく、エラーが起きた具体的なシンボル名などが表示されずイラっとくる。詳細を見るために、右クリックメニューから "Reveal in Log" を選択しなければならずめんどくさい。

Behavior をいじることで、ビルドエラーがおきたときに、エラーメッセージを、メインウィンドウのタブで読みやすく表示する方法についての設定メモ。

Preferences / Behaviors の "Build fails" の項目を下記のように設定。

  • Show "Issue Navigator"

  • Xcode の左側にエラー一覧が出る。が、これだけではメッセージが読みにくいので、さらに設定・・・

  • Hide Debug Area

  • デバッグ領域を隠す。エラーが起きてるから、デバッグ領域は要らないでしょう。ただ、ウィンドウやエディタサイズががちゃがちゃ動くのも見苦しいので、この機能を使わない(チェックを入れない)のもありだと思う。


  • Show Tab "Build Log"

  • Build Log という名前のタブがなければ作成し、そのタブを表示する。
    この設定がないと、ビルドしていたときに開いていたタブ(たいていの場合、直近に編集していたソースファイル)のあった場所にエラーログを表示してしまう。

  • Navigate to current log

  • 作成した "Build log" タブに現在のログ(つまり、失敗したビルドログ)を表示する。





こんな仕様で考えてみた

MacOS で PIC に書き込むことができる
ターゲットへの接続は PicKit3 互換
5V以下のターゲット対応
USBに直接接続(RS-232C変換ケーブルを使用しない)
バスパワー

なお、趣味でハード的、ソフト的に遊ぶ事を目的にしているので、PicKitのファームを丸コピーした互換品にはしない。ライター自体のソフトも開発する。
MOTIBATION


Mac, Linux に対応した PIC 用開発環境 MPLAB X のベータが発表されていた。ここのところ、メインマシンはMacかUbuntuとなり、Windowsを使う機会がめっきりへっているのでありがたい。MPLAB Xで遊んでみようともう。


インストールして、アセンブルが出来る所までは確認できた。が、PicKit3がMacに対応していない。PicKit2なら対応しているらしいが、"3"を持っているのに、いまさら"2"を買い直すのはしゃくだ。


昔から使っている自作PICライターのホストをMac用に書き換えようとしたが、秋月USB RS232Cケーブルが、MacOSでちゃんと動いてくれない。オープン時にOSごとハングしたり、読み出しを続けているとゴミデータを大量に送ってくる等、挙動不審なのだ。また、こいつは、PICがあまりわかってない頃作ったもので、ハード設計もイマイチ。


というわけでPICライターを新たに自作しようと考えた。


VMware Workstation

メインメモリファイル 〜 のロックに失敗しました。
ファイル 〜 から仮想マシンの状態を復元しようとしてエラーが発生しました。



と表示され、サスペンドしたVMの復帰に、毎回、かならず失敗する。






このエラーは VMware の扱うロックファイル(ディレクトリ)が消されずに残っているときに出る。問題が起きる VM のディレクトリを見ると、下記のように拡張子 .lck のディレクトリがあるはず。このディレクトリを削除してしまえば良い。






他のPCなどから、サスペンド状態のVMをコピーして持ってくると起きるようだ。
動作中の VM に .lck ディレクトリがあるのは正常。無理に削除してはいけない。

0) 設定どうするのよ

左側のバーの虫眼鏡に+アイコン、「アプリケーションの検索」で Control Center を検索すると Control Center が起動する。
バーに紫のコントロールセンターアイコンが表示されるので、「ランチャーに常に表示」がおすすめ。

1) 再起動できない

Dell Precision 490 では再起動をしようとすると、UBUNTU ・・・ 画面で停止する。これは11.04になってからのことではなく10.04のころから reboot が効かなかった。以下の対処で治った。

/etc/default/grub の GRUB_CMDLINE_LINUX を変更。
GRUB_CMDLINE_LINUX="reboot=pci"
その後、update-grub を実効

2) ubuntu デスクトップを classic に

新しいのも悪くないので新しいのを使ってる。が、古いのがお気に入りの場合、ログイン画面、ユーザー名を選択したときの画面最下部に出る "ubuntu" を "ubuntu classic" にすれば、10.04 と同じ感じのデスクトップに。

3) 日本語入力、ibus daemon を自動起動

「コントロールセンター」 で「キーボードインプットメソッド」を起動。
「インプットメソッド」タブで「日本語」「Anthy」を選択して追加。

「コントロールセンター」 で「自動起動するアプリケーション」を起動。
コマンド /usr/bin/ibus-daemon -d
を追加登録する。名前と説明はてきとーに。

 結構、相性がきついが頑張ってる

モニター:

HDMI があるからって、家電に繋ごうとか思わない方がいい。できないわけじゃないが、トラブルのもと。OSが起動しないとおもったら画面が出てないだけとか。DVI変換コネクタを使ってPC用モニターに繋ぐのが吉。

ここによると、HDMI形状だが出ている信号はHDMIではないとのこと。
 

microSD/SDHC:

手持ちのカードは全滅(上海問屋無印 2GとKINGMAX 4G Class 6)
付属カードが Kingston 4G Class 4 だったので、Kingston 4G Class4 に加え Kingston 8G Class 4 を調達したら両方ともすんなり。

linux kernelのmmcのコード、あれでいいのかなあ・・・なんか解せないコードが書いてある。

ネームスペースが含まれている XML を libxml2 XPath関数で検索する方法
C, C++, Objective-C, libxml2
 
問題点
 
XML にネームスペースが含まれている場合に xmlXpathEval で検索できなくなる
 
解決方法
xmlXpathEval を呼び出す前に、xmlXpathRegisterNs を利用し、ネームスペースを登録する。
xmlXpathRegisterNs は xpathinternals.h に宣言されている。
 
解説
 
たとえば、Excel の xml 形式ワークシートは以下のような構造になっている。
 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="Sheet1">
  <Table ss:ExpandedColumnCount="84" ss:ExpandedRowCount="1" x:FullColumns="1"
 
    <Row ss:Height="102">
        <Cell><Data ss:Type="String">製品番号</Data></Cell>
 
ここでは、ほぼ全ての要素に ss: の urn:schemas-microsoft-com:office:spreadsheet というネームスペースが用いられている。
このようなXMLに対して、1行分のデータを取り出そうとして、下記のような関数呼び出しをしても、なにもマッチしてくれない。要素がグローバルなネームスペースにないからだ。
xmlXPathEval(BAD_CAST "/Workbook/Worksheet[position()=1]/Table[position()=1]/Row[position()=1]/Cell/Data[position()=1]", ctx);
 
このような場合、xmlXpathEval の前に、xmlXPathRegisterNS を用いてネームスペースを登録する。
xmlXPathRegisterNs(ctx, BAD_CAST "x", BAD_CAST "urn:schemas-microsoft-com:office:spreadsheet");
 
その後、以下のような式を用いることで検索ができるようになる。
 
xmlXPathEval(BAD_CAST "/x:Workbook/x:Worksheet[position()=1]/x:Table[position()=1]/x:Row[position()=1]/x:Cell/x:Data[position()=1]", ctx);
 
ここでは x: を使っているが、どのようなプレフィックスでも構わない。
あえて ssではなく x: を用いて、XMLソースのプレフィックスと、XPathの式でのプレフィックスの違いを確認している。
XML中の xmlns:x= … と xmlXpathEvelの x: は無関係だ。
本来は ss: にするのがわかりりやすいのは言うまでもない。
 This generally means that another instance of this process was already running or is hung in the debugger

が出た。Xcode、iPhone Simulator を再起動したが改善しない。
Terminal で ps -axg | grep ほげ.app としてみたら、開発中の .app (iPad Simulator)が残ってた。

kill -9 しても消えない。リブートするしかないようだ。
 
デバッグに便利。

[NSThread callStackReturnAddresses] は現在の関数呼び出しのスタックの配列を返す。

init などで NSLog するとか、インスタンス変数に copy しておくとかすると、何か問題が起きたとき、どういうコンテキストで作成または操作されたオブジェクトなのかが一目瞭然。


プログラムが止まったとき、インスタンス変数にコピーしたスタック値をデバッガで Print Descriptions to Console でダンプ。



こんな感じのダンプが得られるので、value=の値のコードを見れば良い。

<CFArray 0x16b6b30 [0x30307a00]>{type = immutable, count = 34, values = ( 0 : <CFNumber 0x575d5b0 [0x30307a00]>{value = +177430, type = kCFNumberSInt64Type} 1 : <CFNumber 0x575d5f0 [0x30307a00]>{value = +179341, type = kCFNumberSInt64Type} 2 : <CFNumber 0x575d6f0 [0x30307a00]>{value = +810632758, type = kCFNumberSInt64Type} 3 : <CFNumber 0x575d6b0 [0x30307a00]>{value = +810639143, type = kCFNumberSInt64Type} 4 : <CFNumber 0x16b15e0 [0x30307a00]>{value = +810640304, type = kCFNumberSInt64Type} 5 : <CFNumber 0x16b15f0 [0x30307a00]>{value = +810632758, type = kCFNumberSInt64Type} 6 : <CFNumber 0x575d790 [0x30307a00]>{value = +810631221, type = kCFNumberSInt64Type} 7 : <CFNumber 0x575d7a0 [0x30307a00]>{value = +179617, type = kCFNumberSInt64Type} 8 : <CFNumber 0x575d850 [0x30307a00]>{value = +810632758, type = kCFNumberSInt64Type} 9 : <CFNumber 0x575d860 [0x30307a00]>{value = +810639143, type = kCFNumberSInt64Type} 10 : <CFNumber 0x575d870 [0x30307a00]>{value = +810753438, type = kCFNumberSInt64Type} 11 : <CFNumber 0x575d890 [0x30307a00]>{value = +810632758, type = kCFNumberSInt64Type} 12 : <CFNumber 0x575d8a0 [0x30307a00]>{value = +810631221, type = kCFNumberSInt64Type} 13 : <CFNumber 0x575d8b0 [0x30307a00]>{value = +810877125, type = kCFNumberSInt64Type} 14 : <CFNumber 0x575d810 [0x30307a00]>{value = +34718, type = kCFNumberSInt64Type} 15 : <CFNumber 0x575d820 [0x30307a00]>{value = +21280, type = kCFNumberSInt64Type} 16 : <CFNumber 0x575d830 [0x30307a00]>{value = +815263300, type = kCFNumberSInt64Type} 17 : <CFNumber 0x575d8d0 [0x30307a00]>{value = +815243017, type = kCFNumberSInt64Type} 18 : <CFNumber 0x575d8e0 [0x30307a00]>{value = +815261089, type = kCFNumberSInt64Type} 19 : <CFNumber 0x575d8f0 [0x30307a00]>{value = +815242536, type = kCFNumberSInt64Type} 20 : <CFNumber 0x575db10 [0x30307a00]>{value = +815240215, type = kCFNumberSInt64Type} 21 : <CFNumber 0x575db20 [0x30307a00]>{value = +814969849, type = kCFNumberSInt64Type} 22 : <CFNumber 0x575db30 [0x30307a00]>{value = +814971087, type = kCFNumberSInt64Type} 23 : <CFNumber 0x575da50 [0x30307a00]>{value = +814813151, type = kCFNumberSInt64Type} 24 : <CFNumber 0x575da60 [0x30307a00]>{value = +814722763, type = kCFNumberSInt64Type} 25 : <CFNumber 0x575da70 [0x30307a00]>{value = +814748641, type = kCFNumberSInt64Type} 26 : <CFNumber 0x575d910 [0x30307a00]>{value = +839148405, type = kCFNumberSInt64Type} 27 : <CFNumber 0x575d920 [0x30307a00]>{value = +807687520, type = kCFNumberSInt64Type} 28 : <CFNumber 0x575d930 [0x30307a00]>{value = +807683624, type = kCFNumberSInt64Type} 29 : <CFNumber 0x575d990 [0x30307a00]>{value = +839142449, type = kCFNumberSInt64Type} 30 : <CFNumber 0x575d9a0 [0x30307a00]>{value = +839142646, type = kCFNumberSInt64Type} 31 : <CFNumber 0x575d9b0 [0x30307a00]>{value = +814752238, type = kCFNumberSInt64Type} 32 : <CFNumber 0x575d950 [0x30307a00]>{value = +9444, type = kCFNumberSInt64Type} 33 : <CFNumber 0x575d960 [0x30307a00]>{value = +9298, type = kCFNumberSInt64Type}

アドレスからソースコードを表示させるには、デバッガで

list *アドレス

とする。

スタックトップから2番目の関数の場合、
list* 179341
みたいな感じ。

例外で止まったときの対処とほぼ同じで、大きめのアドレスはシステムライブラリ内(ソースは出ない)小さめのアドレスはユーザーコード(ソースが出る)なので、小さいアドレスをピックアップして呼び出しもとを特定するのが吉。

abort 
NSKVODeallocateBreak
__exceptionPreprocess
__raiseError
_objc_error

追記 2010/11/26
-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]


デスクトップに保存されても困るんだよね〜 Macの PNG アイコンって目立たないから、どこに出現したかわかりにくいし。下記、画面キャプチャファイルの作成場所の変更方法の記事。

http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-change-macos-screen-capture-save-folder-location.html
UIViewController の viewWillAppear などが呼び出されない状態に陥った。一部のビューだけ呼ばれない、単純なサンプルでも呼ばれないなど状況がつかめなかったが、ようやく解決したのでメモを残しておく。問題は複数箇所に及んでいた。

UINavigationControllerDelegate を使ってはいけない。これを使うと呼び出されない場合がある。デバッグのため、とおもって delegate で NSLog を出させていたのが裏目に出た。

UIViewController を拡張して viewWillAppear 等をフックしてはいけない。
@interface UIViewController(debugAddition)
- (void)viewDidAppear:(BOOL)animated;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
@end
小手先のテクニックに溺れてこんな事しちゃ駄目、ってことだな。これもデバッグコードが問題の究明の妨げになっていたのだ。

Xcodeのビルドを疑ってみる。単純なサンプルで呼び出されないときはこれだった。「単純なサンプルでも呼び出されない、SDKのバグでは?」と誤認してだいぶ時間をロスした。Xcodeで正しくコンパイル、リンクされていなかった。Cleanしてビルドしなおしたら解決した。


Snow Leopard で Xcode 3.2 / Instruments 2.0 / iPhone SDK 3.1 の組み合わせでメモリーリークをつぶそうとしていたらスタックフレームのシンボルが表示されなくなった。シンボル名がない状態でメモリーリークをつぶすのはほぼ不可能。

検索してみると、symbolicatecrash が snow leopardで動かないというっていうのが原因という書き込みが随所にみられた。改造版の symbolicatecrash なども出回っている。こいつは根が深いな〜と困っていたのだが、うちの場合はたいしたことじゃなかった。iPhone SDK 3.1 で開発する場合、Simulator 3.1 / Device 3.1 などターゲットを 3.1 すればスタックがちゃんと表示されるようになる。3.0をターゲットにしてるので3.1にしてメモリーリークをつぶしている。

2.1.1アプリを作る場合はこうはいかないね。
kABPersonPhoneProperty
kABPersonInstantMessageProperty
などのアドレスブックに使う定数

ABPeoplePickerNavigationController
アドレスブックを表示するためのコントローラーオブジェクト

これらを使った関数が一度目の起動では動作不良、2度目はちゃんと動くということに出くわした。

具体的にはこう
1) ローカル変数のNSArrayにNSNumberしたkABPersonPhoneProperty などを入れる
2) ABPeoplePickerNavigationController を alloc / init
3) ABPeoplePickerNavigationController.displayProperties に 1)のNSArrayを代入

これだと、配列要素の NSNumber が全部0なんだ。もちろん期待通りの動作はしない。

順番を入れ替えたら動く。
1) ABPeoplePickerNavigationController を alloc / init
2) ローカル変数のNSArrayにNSNumberしたkABPersonPhoneProperty などを入れる
3) ABPeoplePickerNavigationController.displayProperties に 2)のNSArrayを代入

こうすれば、配列要素にはそれぞれそれらしい値が入ってくる。

はあ、ABPeoplePickerNavigationController -init の中で定数値を初期化してるんだあ。と合点。ふつうはしないだろそれ〜って感じですが。

気味悪いので、初期化のためにmain()で
[[[ABPeoplePickerNavigationController alloc] init] release];
とやってやったのだっが、これは何かに引っかかり関数内でHALT

-(void)applicationDidFinishLaunching:(UIApplication *)application
の先頭で同コードを追加してスッキリ(でもないか)


忍者ブログ [PR]
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
フリーエリア
最新CM
[02/07 @naoshi65536]
[02/07 忍]
[09/18 とおりすがり]
[06/26 ilmare]
[03/16 とおりすがり]
最新TB
プロフィール
HN:
naoshi
性別:
男性
職業:
ソフトウェア技術者
趣味:
料理
自己紹介:
@naoshi65536 で連絡がつくはずです。
バーコード
ブログ内検索
カウンター
アクセス解析
FX NEWS

-外国為替-