Many thanks.  It worked for me.  By the way, the
function PrintStackTraceCallback in debughelp.cpp
seems to use swprintf without any guard.  Could it
potentially cause buffer overflow problem?

-Yuan

--- Jan Kotas <[EMAIL PROTECTED]> wrote:
> Ok, there are two ways how to get around this issue:
>
> 1. Change the return type of your method to be int,
> always return 0 from
> the method (you will need to use
> HELPER_METHOD_FRAME_BEGIN_RET_0 instead
> of HELPER_METHOD_FRAME_BEGIN_0 to make it compile),
> and call the method
> using the following pattern:
>
> if (0 != FJit_pHlpMyTest(NULL)) return;
>
> You can find an explanation of how this works in
> fcall.h.
>
> BTW: We have run into similar problems during the
> Whidbey Rotor
> development and used similar workaround to fix it.
> For example, here is
> what the THROW_FROM_HELPER macro in fjit is likely
> to be in Whidbey
> Rotor:
>
> #define THROW_FROM_HELPER(exceptNum)  {
>    \
>         while (NULL == HCALL1(void*,
> FJit_pHlpInternalThrowFromHelper,
> CorInfoException, exceptNum)) { };    \
>         return; }           /* need return so we can
> decode the epilog
> */
>
>
> --- OR ---
>
> 2. Enhance the interpreter in
> clr\src\vm\i386\gmsx86.cpp to understand
> the new opcode. In your case, it would mean adding
> the following lines
> to the big switch statement in
> clr\src\vm\i386\gmsx86.cpp:
>
>             case 0x01:                       // add
> r/m, reg
>             case 0x03:                       // add
> reg, r/m
>                 datasize = 0;
>                 goto DecodeRM;
>
> If you run into more problems like this, you can
> find the offending
> instructions by looking at the code pointed by "ip"
> variable when the
> assert fires.
>
> -Jan
>
> This posting is provided "AS IS" with no warranties,
> and confers no
> rights.
>
> -----Original Message-----
> From: Discussion of the Rotor Shared Source CLI
> implementation
> [mailto:[EMAIL PROTECTED] On Behalf
> Of Yuan Yu
> Sent: Monday, January 26, 2004 1:26 PM
> To: [EMAIL PROTECTED]
> Subject: Re: [DOTNET-ROTOR] Stacktrace
>
> Well, it actually failed on everything I tried. Here
> is exactly what I
> did:
>
> I was using the following compiler:
>
> C:\yuan\proj\rotor>cl
> Microsoft (R) 32-bit C/C++ Optimizing Compiler
> Version 13.10.3077 for
> 80x86
> Copyright (C) Microsoft Corporation 1984-2002. All
> rights reserved.
>
> In inc\corinfo.h, I added CORINFO_HELP_MY_TEST right
> afer
> CORINFO_HELP_MEMCPY in CorInfoHelpFunc.
>
> In vm\jitinterface.cpp,
>
> - after the following line:
>
>   FCDECL2(double, JIT_DoubleDiv, double a, double
> b);
>
> I added:
>
>   FCDECL1(void, JIT_MyTest, void* arg);
>
> - after the following line:
>
>   JITHELPER(CORINFO_HELP_MEMCPY,             NULL
> )
>
> I added:
>
>   JITHELPER(CORINFO_HELP_MY_TEST,
> JIT_MyTest
> )
>
> - after the definition of JIT_NewArr1, I added:
>
>   HCIMPL1(void, JIT_MyTest, void* arg)
>   {
>     HELPER_METHOD_FRAME_BEGIN_0();
>
>     printf("My test to print stack trace.\n");
>     void PrintStackTraceToStdout();
>     PrintStackTraceToStdout();
>
>     HELPER_METHOD_FRAME_END();
>   }
>   HCIMPLEND
>
> In fjit\fjitcompiler.cpp,
>
> - after the following line:
>
>   void (jit_call *FJit_pHlpVerification) (int
> offset);
>
> I added:
>
>   void (jit_call *FJit_pHlpMyTest) (void* arg);
>
> - after the folling line:
>
>   if (!FJit_pHlpAssign_Ref) return false;
>
> I added:
>
>   FJit_pHlpMyTest = (void (jit_call *)(void *arg))
>       (jitInfo->getHelperFtn(CORINFO_HELP_MY_TEST));
>   if (!FJit_pHlpMyTest) return false;
>
> In fjit\fjit.h, after the following line:
>
>   extern void (jit_call *FJit_pHlpVerification) (int
> offset);
>
> I added:
>
>   extern void (jit_call *FJit_pHlpMyTest) (void
> *arg);
>
> In fjit\fjitdef.h, I added a call to FJit_pHlpMyTest
> in
> HELPER_CALL STFLD_I4_helper:
>
> void HELPER_CALL STFLD_I4_helper(unsigned int
> offset, int val,
> CORINFO_Object* or_obj) {
>     if (or_obj == NULL) {
>
> THROW_FROM_HELPER(CORINFO_NullReferenceException);
>     }
>     // added to print stack trace:
>     FJit_pHlpMyTest(NULL);
>     *((int*) ((char*)(or_obj)+offset)) = val;
> }
>
> With these changes, it recompiled successfully.  I
> then tried it on the
> following example:
>
> using System;
>
> class Test
> {
>   public static void Main()
>   {
>     int x = 7;
>     x = 17;
>     Console.WriteLine(x);
>   }
> }
>
> It failed with the following error message:
>
> C:\yuan\proj\rotor\csharp>csc /debug Test.cs
> Microsoft (R) Visual C# Shared Source CLI Compiler
> version 1.0.0003
> for Microsoft (R) Shared Source CLI version 1.0.0
> Copyright (C) Microsoft Corporation 2002. All rights
> reserved.
>
> C:\yuan\proj\rotor\csharp>clix Test
> My test to print stack trace.
> Assert failure(PID 5300 [0x000014b4], Thread: 2760
> [0xac8]): !"Bad
> opcode"
>     File:
> c:\yuan\proj\rotor\sscli-0\clr\src\vm\rotor_x86
>
=== message truncated ===


__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free web site building tool. Try it!
http://webhosting.yahoo.com/ps/sb/

===================================
This list is hosted by DevelopMentorŪ  http://www.develop.com
NEW! ASP.NET courses you may be interested in:

2 Days of ASP.NET, 29 Sept 2003, in Redmond
http://www.develop.com/courses/2daspdotnet

Guerrilla ASP.NET, 13 Oct 2003, in Boston
http://www.develop.com/courses/gaspdotnet

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to