-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JetBrains Rider でデバッグ実行が出来ない #39
Comments
Siv3D 側で回避するためには、プログラムが JetBrains Rider によって実行されているかを判定できる必要があります。 次のコードはプログラムの環境変数を出力するコードです。 #include <iostream>
#include <cstdlib>
int main()
{
extern char** environ;
for (int i = 0; environ[i] != nullptr; ++i)
{
std::cout << environ[i] << '\n';
}
} Visual Studio によって実行した場合、システム環境変数とは別に 同様に JetBrains Rider で実行したときにだけ設定される環境変数があれば、 なお、v0.6 世代でも v0.6.15 からは v8 と同じ仕様になっています。engine フォルダの内容を Resource.rc で実行ファイルに埋め込んでいるので、カレントディレクトリの影響を受けず、エンジン初期化には成功します。 |
ありがとうございます。頂いたコードをもとに JetBrains Rider で実行してみましたが、Visual Studio とは異なり、デバッグ実行時に実行環境を表す特有の環境変数が存在しないことが分かりました。 |
JetBrains Rider にも上記設定がインポートされるかはわかりませんが、今後は |
ご対応ありがとうございます。 |
確かに、ローカル環境のキャッシュの問題であるという可能性は盲点でした しかし、改めてリポジトリを別フォルダにクローンし直してブランチ v8_develop_0706 に切り替えてから起動・実行してみたのですが、やはり依然として環境変数が設定されないようでした どうにも、Rider は VisualStudio で設定された LocalDebuggerEnvironment を取り込むことが出来なさそうです |
確認ありがとうございます。そうでしたか。 |
Win32 API で https://learn.microsoft.com/ja-jp/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent |
標準機能で言うならば |
|
確かに、Rider でも「(デバッグ無しの) Run」をすると |
親プロセスの名前を調べることで、Rider からの起動を判定できそうでした。 # include <Siv3D.hpp> // Siv3D v0.8.0
# include <Siv3D/Windows/Windows.hpp>
# include <tlhelp32.h>
struct ProcessInfo
{
DWORD pid = 0;
String name;
};
Optional<ProcessInfo> GetParentProcess(DWORD processID)
{
HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE)
{
return none;
}
PROCESSENTRY32W pe32
{
.dwSize = sizeof(PROCESSENTRY32W)
};
ProcessInfo parentInfo;
if (::Process32FirstW(hSnapshot, &pe32))
{
do
{
if (pe32.th32ProcessID == processID)
{
parentInfo.pid = pe32.th32ParentProcessID;
break;
}
} while (::Process32NextW(hSnapshot, &pe32));
// 親プロセスの名前を取得
if (parentInfo.pid != 0)
{
::Process32FirstW(hSnapshot, &pe32);
do
{
if (pe32.th32ProcessID == parentInfo.pid)
{
parentInfo.name = Unicode::FromWstring(pe32.szExeFile);
break;
}
} while (::Process32NextW(hSnapshot, &pe32));
}
}
::CloseHandle(hSnapshot);
return parentInfo;
}
void Main()
{
Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
MicrosecClock clock;
if (const Optional<ProcessInfo> parentInfo = GetParentProcess(::GetCurrentProcessId()))
{
clock.console();
Console << parentInfo->pid;
Console << parentInfo->name;
}
else
{
Console << U"Parent process not found";
}
while (System::Update())
{
}
} |
実行中のファイルを含むフォルダの中に実行ファイルに対応する |
漏れていたケースをおおよそカバーできる、低コストで良い方法だと思います。 |
ありがとうございます!検証の件承知いたしました |
v0.6 世代の Siv3D では JetBrains Rider を使用して開発およびエディタからのデバッグ実行が可能でした。しかし、現時点での v0.8 では
Failed to load a engine shader
というエラーダイアログが表示され、初期化に失敗します。詳しく調査したところ、初期化時の
SetWorkingDirectory
で Visual Studio 実行時かどうかを判定する条件分岐が、Rider実行時には適用されていないことが原因であることが分かりました。そのため、デバッグ時の実行ディレクトリがsiv8/WindowsDesktop/App/
ではなくsiv8/WindowsDesktop/Intermediate/Siv3D-Test/Debug/
になってしまいます。The text was updated successfully, but these errors were encountered: