VSCodeを使っていると、Visual Studioでは発生しないエラーが出て困ることがあります。そういったエラーの対策をし、コーディングを快適にする方法を紹介します。
開発環境
- Visual Studio Code:C言語を使用
- OS:Remote WSLでUbuntuを使用
- コンパイラ・デバッガ:gcc, gdb
エラー:ブレークポイントを設定していない箇所で停止する
事象:デバッグ対象ソース(下記画像の左側)のデバッグ時、ブレークポイントを設定していない箇所で停止します。同一ワークスペース内のデバッグ対象外ソースで28行目にブレークポイントを設定している場合は、デバッグ対象ソースの28行目で停止しました。デバッグ対象ソースの停止箇所は、デバッグ対象外ソースのブレークポイント設定箇所と対応しているようです。
原因:同一ワークスペース内のデバッグ対象外ソース(下記画像の右側)にブレークポイントを設定していたためでした。
対策:デバッグ対象外ソースのブレークポイントをすべて削除する。
エラー:scanfで停止中にステップ実行後、Unable to read file
事象:デバッグ中、scanfがある行で停止している時に、ステップイン(F11押下)をした時、下記エラーが出ます。
原因:Ubuntu上にscanfのソースが存在しないためだと思われます。printf, malloc等の標準Cライブラリについては下記の理由から同様のエラーが出るようです。
Debian and Ubuntu do not ship sources as part of the debugging packages unfortunately. As far I can tell, there is no plan to ship sources as part of dbgsym packages, either.
In contrast, Fedora and its downstream distributions have extensive infrastructure to prepare usable source files for debugging. It is not entirely trivial to do this because it requires rewriting file paths in the DWARF data, from the build tree location to the installation location. But it can be really helpful for debugging and gives a nice free software flavor to the entire distribution.
https://stackoverflow.com/questions/52650371/unable-find-printf-c-on-ubuntu-16-04
対策:ステップオーバー(F10押下)をするとエラーがでません。
エラー:最終行で停止している時にステップ実行し、Unable to open ‘libc-start.c’
事象:デバッグ中、最終行で停止している時に、ステップインまたはステップアウトをした時、下記エラーが出ます。
原因:main関数終了後にライブラリのコードを実行しようとしますが、Ubuntu上にlibc-start.cのソースが存在しないためだと思われます。以下githubからの引用です。
This is “by design”. After you return from main, the code belongs to the library code, in this case, libc-start.c, which is not available on your machine, unless you happened to have built the libc runtime you’re using from the source. In generally, you shouldn’t need to look at code that is not yours, so you can just ignore the pop about a missing file. In your example, you can put a breakpoint on the return 0, but you shouldn’t need to step beyond that.
https://github.com/Microsoft/vscode-cpptools/issues/1123
対策:エラーメッセージは無視してください。
コメント