|
i usually avoid them but they are good for finding hard to find electronics like this.
Real programmers use butterflies
|
|
|
|
|
I am afraid you are right.
|
|
|
|
|
Yay! First time ever I actually need to use one ... and it's for QA!
Stack overflow problem that he can't track down, so I thought "how do I monitor stack usage?"
And bingo: a pointer to a local variable!
static void Main(string[] args)
{
unsafe
{
Console.WriteLine(new IntPtr(GetStackLevel()));
}
foo();
bar();
}
static void foo()
{
unsafe
{
Console.WriteLine(new IntPtr(GetStackLevel()));
}
}
static void bar()
{
foo();
unsafe
{
Console.WriteLine(new IntPtr(GetStackLevel()));
}
}
unsafe static char* GetStackLevel()
{
char a;
return &a;
}
}
Probably won't work in production builds as the whole method's existence is likely to be optimized away, but ... works in dev ...
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Stack overflow problems? There's a site for that...
(IGMC)
|
|
|
|
|
What does this help you with Paul ?
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
He's running out of stack, but logging shows that recursion isn't (or shouldn't be) a problem.
So ... the next step is to find out where the stack is being used ...
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Wow, the thrill of 'unsafe'.
Now goto is on the way!
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
CPallini wrote: Now goto is on the way! And then C++
|
|
|
|
|
Please! Let's not go backwards!
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Is the guy using structs by any chance ?
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
I have no code to work from, but he says that all "local variables" have been moved to a class to reduce stack usage. I've mentioned large value types as parameters, but ... no code, so guesswork is the order of the day here - and gathering information, obviously!
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
OriginalGriff wrote: Please! Let's not go backwards! .++C neht dnA
|
|
|
|
|
Not sure if this helps, but I use StackTrace and StackFrameData as discussed here[^] in production code, no pointers required.
|
|
|
|
|
This is also what I do, though the local is declared in a Thread::Start function that invokes the subclass' Enter function after saving the pointer in per-thread data. The pointer is then used to monitor stack usage and stop a stack overflow before it occurs.
|
|
|
|
|
Does it work in release versions?
I'd have thought an intelligent compiler would throw it's hands up in horror and optimize it into a register, then optimize the method into oblivion.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
The item to which a pointer is obtained is declared as a local in a function that remains on the stack, and the pointer to it is saved in per-thread data (the equivalent of thread_local ). So yes, it works in a release build. But this is also C++, and I disable some optimizations so that a release build can actually be debugged.
|
|
|
|
|
They can be quite useful - for example, if you want to get the bytes out of a SecureString[^] without going via a string .
public static byte[] GetBytes(this Encoding encoding, SecureString value)
{
if (encoding is null) throw new ArgumentNullException(nameof(encoding));
if (value is null || value.Length == 0) return Array.Empty<byte>();
IntPtr valuePtr = IntPtr.Zero;
try
{
valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
if (valuePtr == IntPtr.Zero) return Array.Empty<byte>();
unsafe
{
char* chars = (char*)valuePtr;
int byteCount = encoding.GetByteCount(chars, value.Length);
var result = new byte[byteCount];
fixed (byte* bytes = result)
{
encoding.GetBytes(chars, value.Length, bytes, byteCount);
}
return result;
}
}
finally
{
if (valuePtr != IntPtr.Zero)
{
Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
}
}
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Timothy confused, initially, by 0 BYTES FREE (3, 4, 11)
_______________________
Sorry about the very late solution here folks, life gets in the way sometimes!
TOO MUCH INFORMATION
Timothy = Tim
confused (anag. indicator) = TMI
initially = abbreviation / initials
TMI = Too Much Information
0 bytes free = Too much information :-D The point of using the VAR formatting was simply to emphasise that yes, the message was to be taken literally.
I'd quite liked the "0 bytes free" = "too much information" idea anyway, then last week someone replied to Griff's comment that he was off for a wee with "TMI = Too much information" and the die was cast... S'pose I need to think of something else for tomorrow now. Advance warning - I'm out from 09:30 and not back to 16:30, and being on duty can't access emails!
modified 12-May-21 11:54am.
|
|
|
|
|
I suspect you will be up again tomorrow Derek - I'm nowhere with this one.
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
Likewise.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
And there was I, thinking embarrassingly trivial... (and no, that's not a clue).
|
|
|
|
|
So what was it? I've still no idea at all, but suspect my head / desk interface is about to get a bashing.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
NOTE - I may be late posting confirmation / answer as out of contact for a few hours now; but will review on my return!
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
I have no clue either. Initially suggests taking initial letters, or maybe Tim from Timothy. Confused suggests an anagram. 0 could expand to zero. Free is the likely definition, but how do you reach 18 letters with two indicators? timothybyzerobytes is 18 letters, but then what is initially doing in there? It's also poor fodder for an anagram.
|
|
|
|
|
And what is the red bit for?
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|