从cmdline开始时
svnserve.exe -d -r d:\svn\mytools
Run Code Online (Sandbox Code Playgroud)
一切正常.
然后我试图将其设置为以Windows服务运行:
@echo off
set SvnHome=C:\Program Files\TortoiseSVN
set SvnRepository=D:\Svn\mytools
sc delete SvnMyTools
sc create SvnMyTools binPath= "%SvnHome%\bin\svnserve.exe --service -r %SvnRepository%" start= delayed-auto type= share
Run Code Online (Sandbox Code Playgroud)
服务已安装,但无法启动.它一直报告错误
Error 1083: The executable program that this service is configured to run in does not implement the service.
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用regedit编辑服务cmdline,因此尝试添加双引号arround ref to exe,尝试更改cmdline参数(使用-d代替--service,同时使用-d和--service)等等.有时报告的错误看起来有点不同,但无论如何都不起作用.:-(
问题是 - 如何设置它使其在Windows 7 x64上作为服务工作?有可能吗?我的意思是 - 如果" - service"cmdline开关能够在svnserve中工作吗?
注意:svnserve版本是1.7.9(r1462340).其余的TortoiseSVN组件是1.7.12.24070.
提前致谢.
一个特定的问题只能在客户方重现。尽管我们进行了所有尝试,但我们无法在本地复制它。
但我知道 Windows 2008 R2 中的 TaskMgr 可以为进程创建转储文件。所以,我的问题是:是否可以在客户站点上为我们软件的某个进程创建转储,然后在本地调查该转储文件?
我们已经对我们的软件进行了新的构建(我们为所有二进制文件保存了一个构建沙箱和 *.PDB 文件)。然后我们在现场安装了它,现在我们正在等待客户报告问题再次发生时,因此我们将为挂起过程创建一个转储文件,然后尝试对其进行调查。
我的问题有两部分:
目前我怀疑这是否可行。因为我试图在我的本地 Win 2008 R2 VM 上创建一个验证测试。我使用.PDB 文件Sleep(30000)构建所有文件,然后我以一种模式运行我们的软件,当它在中间暂停很长时间时,我在 TaskMgr 中单击“创建转储文件”,恰好在它暂停时(它的简单调用)。然后我尝试在 WinDbg 中加载该转储文件并检查我能在那里找到什么。让我对这种方式感到悲观的第一件事是错误的堆栈跟踪。特别是 - 我在 WinDbg 中看不到完整的堆栈跟踪。它只显示 wow64 .dll 和 ntdll.dll 模块的堆栈跟踪,我看不到我们代码的堆栈跟踪。特别是我只看到这个:
wow64cpu!TurboDispatchJumpAddressEnd+0x6c0
wow64cpu!TurboDispatchJumpAddressEnd+0x56b
wow64!Wow64SystemServiceEx+0x1ce
wow64!Wow64LdrpInitialize+0x42a
ntdll!RtlUniform+0x6e6
ntdll!RtlCreateTagHeap+0xa7
ntdll!LdrInitializeThunk+0xe
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用调试器附加进程时,我看到一个完整的调用堆栈,如下所示:
ntdll.dll! 7754fd910
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7754fd9l0
KernelBase.dll! 76ae3bd50
KernelBase.dll! 76ae44a 5Q
ScrVm.DLL!Profiler::DoSleep(intmilliseconds=30000) Line 205
ScrVm.DLL!Script::VmToolKit::iMethod_Sleep(unsigned …Run Code Online (Sandbox Code Playgroud) 注意:MRE 示例太大,无法在此处发布(!),因此我将其存储在我的谷歌驱动器上,这里是一个链接 - https://drive.google.com/uc?id=1BUDD2DhumdY2eVwO5BffyaQfjVIdABb3&export=download
我需要调整使用 Xerces(1.6)/Xalan(1.3) 的非常旧的库以使用新的 Xerces(3.2.5)/Xalan(1.12)。原因很简单,因为使用现代 Microsoft C++ 编译器和 STL 几乎不可能构建此代码。
为了保持接口兼容,我必须对一些 Xerces/Xalan 对象使用包装类。包装器将 Xerces/Xalan 对象存储为void*指针。我想使用 RTTI 添加类型转换验证。但出了点问题...
这是强制转换验证函数的代码:
template<class T>
T* castAndCheck(const XmlLibObjectWrapper* pObjWrap)
{
T* result = (T*)(pObjWrap->EngineObj);
#ifdef _CPPRTTI
const type_info& ti = typeid(*result);
const type_info& tiExpected = typeid(T);
if (ti != tiExpected)
{
// I want it throw bad_cast here BUT IT DOES NOT!...
//T& resultSpecific = dynamic_cast<T&>(*result); //<- this has the same problem
T* resultSpecific = dynamic_cast<T*>(result);
if (resultSpecific == …Run Code Online (Sandbox Code Playgroud)