CとC++/CLIでホワイトスペースかチェック

Cのワイドキャラと.NETでちょっと違う。ロカールかカルチャ問題か。スルー

出力

.NETのバイト出力がすごく面倒くさい。エンディアン問題もある。

ドットを含むパスを直してくれる関数

Win32のGetFullPathName()かCRTの_wfullpathでできる。後者は前者を呼ぶだけ。

エッジのお気に入りをすべて削除

上のフォルダをエクスプローラで開き、DataStoreFavoritesを削除する。

gitで配下のディレクトリすべてのstatusを調べる

svnの場合以下のコマンドで配下のディレクトリの状態を調べることができた。

gitだと普通にやるのは無理みたいなのでfindでやる。

ただこれだとフルパスを表示できないのでどこにあるファイルかわからない。

暫定案

これだとgit svn dcommit忘れやpush忘れを表示できない

意味不明になってきたのでスルー

git-svnでsvnとgitの両方で同じプロジェクトを管理

ここではプロジェクトMyUtilityをgitとgit-svnで両方からつかう。git-svnはsvnのリポジトリを操作するだけでgitリポジトリはつくらない。それならsvnでやればいいわけだが、インストールしてない場合やgitライクに扱いたい場合は面白いのか。

git-svnを使ってsvnみたいなことをする(最初)

svnの場合

gitの場合

git-svnを使ってsvnみたいなことをする(2回目から)

svnの場合

git-svnの場合

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回呼ばないと閉じれない。子プロセスは環境変数やカレントディレクトリを引き継ぐので動く。

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