if (NOT "${retcode}" STREQUAL "0")
message(FATAL_ERROR "Fatal error when downloading dotnet install script")
endif()
+ if (CLR_CMAKE_PLATFORM_ARCH_I386)
+ set(NETSDKARCH "x86")
+ elseif()
+ set(NETSDKARCH "x64")
+ endif()
execute_process(
- COMMAND powershell -File "${CMAKE_CURRENT_BINARY_DIR}/dotnet-install.ps1" -Channel "${DOTNET_CHANNEL}" -InstallDir "${DOTNET_DIR}" -Architecture x64 -Verbose
+ COMMAND powershell -File "${CMAKE_CURRENT_BINARY_DIR}/dotnet-install.ps1" -Channel "${DOTNET_CHANNEL}" -InstallDir "${DOTNET_DIR}" -Architecture ${NETSDKARCH} -Verbose
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE retcode)
if (NOT "${retcode}" STREQUAL "0")
return (uint64_t)(size_t)context->Sp;
#elif defined(_TARGET_ARM64_)
return (uint64_t)(size_t)context->Sp;
-#elif
+#else
#error "Unsupported platform"
#endif
}
if (deltaILFileStream.is_open() && deltaMDFileStream.is_open())
{
auto deltaILSize = deltaILFileStream.tellg();
- BYTE *deltaILMemBlock = new BYTE[deltaILSize];
+ if (deltaILSize < 0)
+ return E_FAIL;
+ BYTE *deltaILMemBlock = new BYTE[(size_t)deltaILSize];
deltaILFileStream.seekg(0, std::ios::beg);
deltaILFileStream.read((char*)deltaILMemBlock, deltaILSize);
auto deltaMDSize = deltaMDFileStream.tellg();
- BYTE *deltaMDMemBlock = new BYTE[deltaMDSize];
+ if (deltaMDSize < 0)
+ return E_FAIL;
+ BYTE *deltaMDMemBlock = new BYTE[(size_t)deltaMDSize];
deltaMDFileStream.seekg(0, std::ios::beg);
deltaMDFileStream.read((char*)deltaMDMemBlock, deltaMDSize);
return pDebugger->ConfigurationDone();
}
-int main(int argc, char* argv[])
+int
+#if defined(WIN32) && defined(_TARGET_X86_)
+ __cdecl
+#endif
+ main(int argc, char* argv[])
{
DWORD pidDebuggee = 0;
/// <param name="normalTokens">array of normal methods tokens</param>
/// <param name="data">pointer to memory with result</param>
/// <returns>"Ok" if information is available</returns>
- internal static RetCode GetModuleMethodsRanges(IntPtr symbolReaderHandle, int constrNum, IntPtr constrTokens, int normalNum, IntPtr normalTokens, out IntPtr data)
+ internal static RetCode GetModuleMethodsRanges(IntPtr symbolReaderHandle, uint constrNum, IntPtr constrTokens, uint normalNum, IntPtr normalTokens, out IntPtr data)
{
Debug.Assert(symbolReaderHandle != IntPtr.Zero);
data = IntPtr.Zero;
typedef RetCode (*GetSequencePointByILOffsetDelegate)(PVOID, mdMethodDef, uint32_t, PVOID);
typedef RetCode (*GetNextSequencePointByILOffsetDelegate)(PVOID, mdMethodDef, uint32_t, uint32_t*, int32_t*);
typedef RetCode (*GetStepRangesFromIPDelegate)(PVOID, int32_t, mdMethodDef, uint32_t*, uint32_t*);
-typedef RetCode (*GetModuleMethodsRangesDelegate)(PVOID, int32_t, PVOID, int32_t, PVOID, PVOID*);
+typedef RetCode (*GetModuleMethodsRangesDelegate)(PVOID, uint32_t, PVOID, uint32_t, PVOID, PVOID*);
typedef RetCode (*ResolveBreakPointsDelegate)(PVOID[], int32_t, PVOID, int32_t, int32_t, int32_t*, PVOID*);
typedef RetCode (*GetAsyncMethodSteppingInfoDelegate)(PVOID, mdMethodDef, PVOID*, int32_t*, uint32_t*);
typedef RetCode (*GetSourceDelegate)(PVOID, const WCHAR*, int32_t*, PVOID*);
return S_OK;
}
-HRESULT GetModuleMethodsRanges(PVOID pSymbolReaderHandle, int32_t constrTokensNum, PVOID constrTokens, int32_t normalTokensNum, PVOID normalTokens, PVOID *data)
+HRESULT GetModuleMethodsRanges(PVOID pSymbolReaderHandle, uint32_t constrTokensNum, PVOID constrTokens, uint32_t normalTokensNum, PVOID normalTokens, PVOID *data)
{
std::unique_lock<Utility::RWLock::Reader> read_lock(CLRrwlock.reader);
if (!getModuleMethodsRangesDelegate || !pSymbolReaderHandle || (constrTokensNum && !constrTokens) || (normalTokensNum && !normalTokens) || !data)
WCHAR *localName, ULONG localNameLen, ULONG32 *pIlStart, ULONG32 *pIlEnd);
HRESULT GetHoistedLocalScopes(PVOID pSymbolReaderHandle, mdMethodDef methodToken, PVOID *data, int32_t &hoistedLocalScopesCount);
HRESULT GetStepRangesFromIP(PVOID pSymbolReaderHandle, ULONG32 ip, mdMethodDef MethodToken, ULONG32 *ilStartOffset, ULONG32 *ilEndOffset);
- HRESULT GetModuleMethodsRanges(PVOID pSymbolReaderHandle, int32_t constrTokensNum, PVOID constrTokens, int32_t normalTokensNum, PVOID normalTokens, PVOID *data);
+ HRESULT GetModuleMethodsRanges(PVOID pSymbolReaderHandle, uint32_t constrTokensNum, PVOID constrTokens, uint32_t normalTokensNum, PVOID normalTokens, PVOID *data);
HRESULT ResolveBreakPoints(PVOID pSymbolReaderHandles[], int32_t tokenNum, PVOID Tokens, int32_t sourceLine, int32_t nestedToken, int32_t &Count, PVOID *data);
HRESULT GetAsyncMethodSteppingInfo(PVOID pSymbolReaderHandle, mdMethodDef methodToken, std::vector<AsyncAwaitInfoBlock> &AsyncAwaitInfo, ULONG32 *ilOffset);
HRESULT GetSource(PVOID symbolReaderHandle, const std::string fileName, PVOID *data, int32_t *length);
}
pMDImport->CloseEnum(fEnum);
- if (constrTokens.size() > std::numeric_limits<int32_t>::max() || normalTokens.size() > std::numeric_limits<int32_t>::max())
+ if (sizeof(std::size_t) > sizeof(std::uint32_t) &&
+ (constrTokens.size() > std::numeric_limits<uint32_t>::max() || normalTokens.size() > std::numeric_limits<uint32_t>::max()))
{
LOGE("Too big token arrays.");
return E_FAIL;
}
PVOID data = nullptr;
- IfFailRet(Interop::GetModuleMethodsRanges(pSymbolReaderHandle, (int32_t)constrTokens.size(), constrTokens.data(), (int32_t)normalTokens.size(), normalTokens.data(), &data));
+ IfFailRet(Interop::GetModuleMethodsRanges(pSymbolReaderHandle, (uint32_t)constrTokens.size(), constrTokens.data(), (uint32_t)normalTokens.size(), normalTokens.data(), &data));
if (data == nullptr)
return S_OK;
if (info_pair == m_modulesInfo.end())
return E_FAIL; // we must have it, since we loaded data from it
- if (Tokens.size() > std::numeric_limits<int32_t>::max())
+ if ((int32_t)Tokens.size() > std::numeric_limits<int32_t>::max())
{
LOGE("Too big token arrays.");
return E_FAIL;
serialize_output(count, m_seqCounter, name, "", escaped_source);
// compute total size of headers + text
- size_t const total_size = count.size() + escaped_text.size();
+ auto const total_size = count.size() + escaped_text.size();
// perform output
cout << CONTENT_LENGTH << total_size << TWO_CRLF;
constexpr static const size_t MaxIteratorSize = sizeof(void*) * 2;
const Operations& ops;
- mutable char data alignas(alignof(std::max_align_t)) [MaxIteratorSize];
+
+ // Note, we can't use `alignas(alignof(std::max_align_t))` here, since at least MSVC 32bit (VS2019) compiler can't
+ // generate proper code and ASAN detect "ERROR: AddressSanitizer: stack - buffer - underflow on address...".
+ union data_align_t
+ {
+ std::max_align_t align_field;
+ mutable char data[MaxIteratorSize];
+ };
+ data_align_t data_align_tmp;
+ char * const data;
public:
/// Iterator might be created from any other iterator or pointer type,
/// for which `operator*` returns reference to `AsyncHandle`.
template <typename Iterator,
typename = typename std::enable_if<std::is_convertible<decltype(*std::declval<Iterator>()), AsyncHandle&>::value>::type>
- AsyncHandleIterator(Iterator it) : ops(OpsImpl<Iterator>::ops) { new (data) Iterator(it); }
+ AsyncHandleIterator(Iterator it) : ops(OpsImpl<Iterator>::ops), data(data_align_tmp.data) { new (data) Iterator(it); }
~AsyncHandleIterator() { ops.destr(data); }
Class::IOSystem::StdFiles Class::get_std_files()
{
using Handles = std::tuple<IOSystem::FileHandle, IOSystem::FileHandle, IOSystem::FileHandle>;
- /*thread_local*/ static alignas(alignof(Handles)) char mem[sizeof(Handles)]; // TODO
+
+ // Note, we can't use `alignas(alignof(std::max_align_t))` here, since at least MSVC 32bit (VS2019) compiler can't
+ // generate proper code and ASAN detect "ERROR: AddressSanitizer: stack - buffer - underflow on address...".
+ union mem_align_t
+ {
+ std::max_align_t align_field;
+ char mem[sizeof(Handles)];
+ };
+ mem_align_t mem_align_tmp;
+ char * const mem = mem_align_tmp.mem;
+
Handles& handles = *new (mem) Handles {
FileHandle(GetStdHandle(STD_INPUT_HANDLE)),
FileHandle(GetStdHandle(STD_OUTPUT_HANDLE)),
{
if (size_t(in_avail()) <= MaxMoveSize) // tail is not too big
{
- memmove(eback() + UngetChars, gptr(), in_avail());
+ memmove(eback() + UngetChars, gptr(), size_t(in_avail()));
setg(eback(), eback() + UngetChars, eback() + UngetChars + in_avail());
}
}
using System;
using System.IO;
+using System.Runtime.InteropServices;
using NetcoreDbgTest;
using NetcoreDbgTest.MI;
Context.WasEntryPointHit(@"__FILE__:__LINE__");
});
+ bool win32detect = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && IntPtr.Size == 4; Label.Breakpoint("STEP0");
+
P p = new P(); Label.Breakpoint("STEP1");
Label.Checkpoint("test_steps", "try_catch", (Object context) => {
Context Context = (Context)context;
Context.StepOver(@"__FILE__:__LINE__");
+ Context.WasStep(@"__FILE__:__LINE__", "STEP0");
+ Context.StepOver(@"__FILE__:__LINE__");
Context.WasStep(@"__FILE__:__LINE__", "STEP1");
Context.StepOver(@"__FILE__:__LINE__");
Context.WasStep(@"__FILE__:__LINE__", "TRY1");
Label.Checkpoint("try_catch", "finish", (Object context) => {
Context Context = (Context)context;
+
+ var resWin32Detect = Context.MIDebugger.Request(String.Format("-var-create - * \"win32detect\""));
+ Assert.Equal(MIResultClass.Done, resWin32Detect.Class, @"__FILE__:__LINE__");
+ Assert.Equal("bool", ((MIConst)resWin32Detect["type"]).CString, @"__FILE__:__LINE__");
+ string win32detect = ((MIConst)resWin32Detect["value"]).CString;
+
// Check stack frames location
var res = Context.MIDebugger.Request("-stack-list-frames");
Assert.Equal(MIResultClass.Done, res.Class, @"__FILE__:__LINE__");
var stack = (MIList)res["stack"];
-
- Assert.Equal(3, stack.Count, @"__FILE__:__LINE__");
- Assert.True(Context.IsValidFrame((MIResult)stack[0], "CATCH4", 0), @"__FILE__:__LINE__");
- Assert.True(Context.IsValidFrame((MIResult)stack[1], "THROW1", 1), @"__FILE__:__LINE__");
- Assert.True(Context.IsValidFrame((MIResult)stack[2], "TRY3", 2), @"__FILE__:__LINE__");
+ if (win32detect == "true")
+ {
+ Assert.Equal(1, stack.Count, @"__FILE__:__LINE__");
+ Assert.True(Context.IsValidFrame((MIResult)stack[0], "CATCH4", 0), @"__FILE__:__LINE__");
+ }
+ else
+ {
+ Assert.Equal(3, stack.Count, @"__FILE__:__LINE__");
+ Assert.True(Context.IsValidFrame((MIResult)stack[0], "CATCH4", 0), @"__FILE__:__LINE__");
+ Assert.True(Context.IsValidFrame((MIResult)stack[1], "THROW1", 1), @"__FILE__:__LINE__");
+ Assert.True(Context.IsValidFrame((MIResult)stack[2], "TRY3", 2), @"__FILE__:__LINE__");
+ }
//Check local variables
res = Context.MIDebugger.Request("-stack-list-variables");
disableRawMode();
}
-static void WindowSizeChanged(int) {
+static void
+#if defined(WIN32) && defined(_TARGET_X86_)
+ __cdecl
+#endif
+ WindowSizeChanged(int) {
// do nothing here but setting this flag
gotResize = true;
#ifdef _WIN32
}
}
-int main (int argc, char** argv) {
+int
+#if defined(WIN32) && defined(_TARGET_X86_)
+ __cdecl
+#endif
+ main (int argc, char** argv) {
linenoiseInstallWindowChangeHandler();
while(argc > 1) {