Author Archives: admin

svnからgitへの移行(1つずつ)

SubversionからGitへのプロジェクトの移行メモ。

ここではGitサーバ(リモートリポジトリ)にユーザgituserが存在してsshで接続できていることが前提。

svnのblogprogsをgitへ移行

Gitサーバでgituserでログインして以下を行いリポジトリをつくる。

ローカルでgit-svnでsvnから履歴含めて持ってきてgitに変換する。ここではcygwinを使っている。

ローカルでちゃんとできたか確認

svnのプロジェクトが不必要なので削除したいけど怖いのでobsoletesへ移動。

Visual StudioでSTLにステップインさせないーステップフィルター

以下のソースコード中にあるXMLを“%USERPROFILE%\My Documents\Visual Studio 2017\Visualizers\.natstepfilterに保存する。ドットで始まるファイル名なのでエクスプローラだとリネームできないかもしれないがコマンドプロンプト等でやる。デバッグ開始時に読み込むようなのでVisual Studioを再起動する必要はない。Visual Studio 2017で確認。

詳細

レファレンスはこちら

デフォルトのステップフィルタは %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers にある。上記のステップフィルターだとstd::make_uniqueでクラスをnewするときにコンストラクタをスルーしてしまうので以下のように書き換えるとステップ・インする。

ソースコード

https://github.com/ambiesoft/blogprogs/tree/master/4568/stepInMakeUnique

4127警告とpragma disable

マイクロソフトのC++コンパイラで以下のマクロをコンパイルすると警告4127(条件式が定数)が出る。

この警告を消したくてpragmaを使おうとしても、外から囲うと無意味だし中に書くと#がマクロの文字列化でうまくいかない。

__pragmaキーワード

マイクロソフト拡張のこのキーワードを使えば解決できる。

windbgのシンボルサーバとキャッシュ(cacheとsrv)

windbgのシンボルサーバとキャッシュの設定がややこしいので少しまとめたい、がよくわからないところもある。

ソース:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/symbol-path

設定

設定はFile⇒Symbol File Path…から行う。デバッグ中の場合設定を反映するには.reloadを行う。設定した後は必ずFile⇒Save Workspaceを実行して保存すること。

設定する種類

設定する種類は4つ。

  • 普通のパス
  • 普通のキャッシュ
  • シンボルサーバ
  • シンボルサーバのキャッシュ

普通のパス

>普通のパスはセミコロンで区切って設定する。このパスがあるとwindbgは3つのパスを探す。パスがC:\MyDirだった場合でモジュールがDLLだった場合、最初にc:\MyDir\symbols\dll\を探す、次にc:\MyDir\dll\を探す。最後にc:\MyDir\を探す。探すファイルは名前で探すのではなくすべての*.pdbから同じGUIDのものを見つける(多分)。デバッグビルドではpdbやDLLにGUIDが振られ、それで一致させるものと思われる。これは特に設定しなくてもモジュールの存在するディレクトリは探すと思われる。

普通のキャッシュ

cache*C:\MyCacheなどと設定する。*は区切り文字を表す。これを記述している位置が重要で、ここより右にある普通のパスに対してのみキャッシュする。キャッシュディレクトリはモジュール名の下になんらかのハッシュあるいはGUIDディレクトリをつくることになるので、普通のパスから見つけるよりは早くなると思われる。C:\MyCacheを省略してcache*とだけ書くとデフォルトのキャッシュディレクトリ、多分C:\ProgramData\dbg\symに保存すると思われるが、これを指定しなくても保存するようにも思われる。

シンボルサーバ

srv*pathで記述する。pathはローカルのパスでもhttpでもいい。ローカルの場合、普通のパスとの違いはdllなどのサブディレクトリを検索しないこと(多分)と、普通のキャッシュにキャッシュしないこと、ローカルパスを記述する場合、もともと存在しているpdbをここに手動で移動することを想定していると思われる。pdbにはソースのフルパスが書かれており、ビルドした位置にからソースもpdbも移動させないなら、普通のパスを使って移動させる場合はここに書くのだと思われる。httpの場合も特に違いはない。

シンボルサーバのキャッシュ

srv*localpath*pathで記述する。localpathがpathのキャッシュになる。普通のキャッシュと同じ場所においていいかは不明だけど多分大丈夫。

シンボルを探す順番

不明だが多分左から探すと思われる。

Lazy Symbol Loading

windbgはシンボルが見つかったからといって勝手に読み込んだりはしないのでldコマンドでロードする。-sオプションをつけてwindbgを起動すれば、この機能が無効になりロードするようになるらしい。

バッチファイルでパスを設定してコマンドプロンプトを開く

プロジェクトのビルドなどの説明でシステムパスの設定を要求することが多いがシステム変更はなるべくしたくないし、反映するのに再起動しないとならないとか面倒なのでパスを設定してコマンドプロンプトを開くバッチファイルの紹介

これを適当なバッチファイル(*.bat)で保存して開くと、そのファイルが置いてある配下のdepot_toolsがパスの先頭に追加され、cdされてコマンドプロンプトを開く。

%~dp0がファイルの置いてあるディレクトリを表す。
cmd /kはウインドウを閉じない。

エクスプローラなどから開くとウインドウは閉じるがcmd /kで新しく開いている。プロンプト内から開くと新しく起動してしまうのでexitを2回呼ばないと閉じれない。子プロセスは環境変数やカレントディレクトリを引き継ぐので動く。

と思ったのだが、開かれたウインドウでも実行結果が表示されたままなので違う動きをしているのかもしれない。

フォルダ設定のダイアログをコマンドラインから開く

方法1

方法2
一般タブ

ビュータブ

検索タブ

参考

ロケール ACP コンソール

ReadFile

コンソール含めたファイルから読み込むには最終的にAPIのReadFileを呼ぶ。

入力元がコンソールの場合、この関数は改行すると制御が返る。EOFはここでは普通の文字として扱われ特別な処理はない。入力元がファイルの場合は終わりに達すると単にdwReadが0になる。

ここでコンソールに日本語を入力した時の文字コードはGetACP()と同じと思われ、レジストリHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\ACPの値、この値はコントロールパネルの地域と言語の設定の非ユニコードアプリの設定になると思われる。この値の変更はシステム再起動が必要。

SetConsoleCP()を使えばプロセスの入力コードページを変えられるが、CP_UTF8を設定してReadFileを呼んでもうまく読み込めない。IMEが起動しなくなりコピペで入力してもdwRead=0が返る(XPの場合)。

ReadFile()は汎用の入力APIだがコンソール用のReadConsole()がある。引数はReadFile()と大体同じだが、レファレンスによるとこの関数を使えばユニコードを読めると書いてある。そしてこの関数はAnsiとUnicodeで関数がわかれている。ReadConsoleW()を呼べばユニコード入力を受け取れる。

出力も同様にSetConsoleOutputCP(), WriteConsole()などでできると思う。

標準ライブラリ

上記はAPIレベルの話だったが、C標準ライブラリでは入力元がファイルだろうがコンソールだろうが同様に扱うので最終的にReadFile()を呼ぶ。よってコンソールからのユニコード入力はできないと思われる。

このコードはコンソールからReadFile()読んだデータをユニコードに変換して返す。変換のはロケールにしたがって動くのでデフォルトのCロケールだと日本語すらちゃんと変換できない。

こう書くとロケールのコードページ932が指定されユニコードに変換されるので日本語は入力できるが中国語などは入力できないしここでロケールを中国語に変えても元々が932で読み込んでるので正しく変換できないだろう。

_setmode()関数の引数にユニコード関係も追加されたがこれらは入力がファイルの場合には機能するがコンソールの場合はうまくいかないだろう。

コンソールからの入力は上記のように大変だが出力はWriteFile()でもうまく動くとの報告もあるが調べてない。

Visual Studio2017でソリューションエクスプローラーが表示しない

パフォーマンスの改善とかいう通知が出てきてソリューションウインドウを開かない設定にしたら戻せなくなったのでメモ。

[ツール]→[オプション]でダイアログを表示し、左ペインのツリーから「プロジェクトおよびソリューション」を選択し右ペインの一番下のチェックボックスに「すべてのソリューションのライトウェイトソリューションロード」に設定がある。

グローバルな設定とソリューションごとの設定があるらしい、上記はグローバルの設定。なぜかグローバルの方が優先される模様。
ソリューションごとの設定はソリューションエクスプローラーを右クリックして「ライトウェイトソリューションロード」の項目があるが、変更されたかはすぐ確認できないがVSを再起動すると反映されてる。

Visual Studioのソリューションを2015でなく2017で開くようにする

*.slnをテキストエディタで開き最初の方の以下の部分

を以下に変える

ここのバージョンとかは将来変わるかもしれないのでVS2017で適当な新規プロジェクトを作ってそれをコピーすればいいと思う。