Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
  • Help Room /
avatar image
1
Question by kevin-masson · Aug 08, 2019 at 06:47 AM · c#editor-scriptingdebugloggingstacktrace

Wrapping Debug.Assert and skip wrap method in the stack trace

I'm trying to wrap Debug.Assert() into multiple functions to allow the following:

  • have 2 type of asserts (Release: always enabled, Dev: enabled in the editor and in the build when a specific flag is set)

  • set a default assert message containing the LOC related to the error using CompilerServices. CallerFilePath and CompilerServices.CallerLineNumber

So far, i have the following:

 using System.Diagnostics;
 
 public static class Asserts
 {
     /// <summary>Runtime and editor asserts. These will always be executed.</summary>
     /// <param name="context">The object attached to this assert. Unused in web builds.</param>
     public static void ReleaseAssert(bool condition, string message, UnityEngine.Object context = null)
     {
         #if UNITY_EDITOR
         UnityEngine.Debug.Assert(condition, message, context);
         #elif !UNITY_EDITOR && UNITY_WEBGL
         UnityEngine.Debug.Assert(condition, message);
         #else
         UnityEngine.Debug.Assert(false, "RealseAssert case not supported.");
         #endif
     }
 
     /// <summary>Asserts that are executed only for deveveloppers or when ALL_ASSERTS build flag is specified.</summary>
     [Conditional("UNITY_EDITOR"), Conditional("ALL_ASSERTS")]
     public static void Assert(bool condition, string message, UnityEngine.Object context)
     {
         UnityEngine.Debug.Assert(condition, message, context);
     }
 
     /// <summary>Asserts that are executed only for deveveloppers or when ALL_ASSERTS build flag is specified.</summary>
     [Conditional("UNITY_EDITOR"), Conditional("ALL_ASSERTS")]
     public static void Assert(bool condition, string message)
     {
         UnityEngine.Debug.Assert(condition, message);
     }
 }


But there is only one problem i need to resolve. By wrapping Debug.Assert the message logged in the editor console does not redirect to the correct part of the code. It redirect to Asserts.RealaseAssert or Asserts.Assert but i would like it to redirect to the parent method that called my wrapper.

I found some interesting things like StackTrace.METHODS_TO_SKIP or the StackTrace constructor that allows you to give a number of StackFrame (method) to skip. But I am not able to log the stack trace with a link to the code.

I also tried to inline my methods with AggressiveInlining but it does not change anything.

Do you have any idea of how to fix this ?

Comment
Add comment · Show 4
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Develax · Jan 28, 2020 at 04:36 PM 0
Share

Looking for the same answer, still with no luck.

avatar image kevin-masson Develax · Jan 29, 2020 at 03:55 PM 0
Share

I have been using this and it works :) https://stackoverflow.com/a/37605142/4623982

avatar image Develax kevin-masson · Jan 29, 2020 at 06:55 PM 0
Share

Could you share an example of using that approach? I still can't make it redirect to the expected line of code.

Show more comments

2 Replies

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by kevin-masson · Feb 04, 2020 at 08:16 AM

Utilities used to set a custom stack trace:

 public static class ExceptionUtilities
 {
     private static readonly FieldInfo STACK_TRACE_STRING_FI = typeof(Exception).GetField("_stackTraceString", BindingFlags.NonPublic | BindingFlags.Instance);
     private static readonly Type TRACE_FORMAT_TI = Type.GetType("System.Diagnostics.StackTrace").GetNestedType("TraceFormat", BindingFlags.NonPublic);
     private static readonly MethodInfo TRACE_TO_STRING_MI = typeof(StackTrace).GetMethod("ToString", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { TRACE_FORMAT_TI }, null);
 
     public static Exception SetStackTrace(this Exception target, StackTrace stack)
     {
         var getStackTraceString = TRACE_TO_STRING_MI.Invoke(stack, new object[] { Enum.GetValues(TRACE_FORMAT_TI).GetValue(0) });
         STACK_TRACE_STRING_FI.SetValue(target, getStackTraceString);
         return target;
     }
 }

Using this to log an exception that skip the current method:

 public static void SomeMethod()
 {     
     // Create a stack trace that ignore the current method.
     StackTrace trace = new StackTrace(1, true);
 
     // Assign it to some exception.
     var ex = new Exception();
     ex.SetStackTrace(trace);
 
     Debug.LogException(ex);
 }
Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Ruhan-_- · Sep 07, 2021 at 02:24 AM 0
Share

is it possible to modify this to use with just Debug.Log? Or Debug.LogWarning? I expect we'd need a different field info type in which case the variable name "_stackTraceString" would have to be different.

I need to erase the first two lines of the Debug.Log stack trace, I came close with your solution but its still an exception

avatar image sinaari Ruhan-_- · Dec 22, 2021 at 05:14 PM 0
Share

See the answer here: https://forum.unity.com/threads/need-to-exclude-a-method-from-the-console-stack-trace.1061453/

avatar image
0

Answer by Develax · Feb 04, 2020 at 11:53 AM

@kevin-masson thanks, well done!

I've wrapped it this way:

 using System.Diagnostics;
 
 public static class MyDebug
 {
     private const string _assertMessage = "The object of type '{0}' is `null`'.";
     private const string _assertMessageWithName = "The instance of type '{0}' is `null` in the '{1}'.";
 
     [Conditional("UNITY_ASSERTIONS")]
     public static void Assert<T>(T obj, UnityEngine.Object context)
         where T : class
     {
         if (obj != null)
             return;
 
         string message = string.Format(_assertMessageWithName, typeof(T), context);
         LogError(message);
     }
 
     [Conditional("UNITY_ASSERTIONS")]
     public static void Assert<T>(T obj)
         where T : class
     {
         if (obj != null)
             return;
 
         string message = string.Format(_assertMessage, typeof(T));
         LogError(message);
     }
 
     private static void LogError(string message)
     {
         StackTrace trace = new StackTrace(2, true);
         var exc = new GameException(message).SetStackTrace(trace);
         UnityEngine.Debug.LogException(exc);
     }
 }



then I use it as a normal Debug.Assert:

 private void Awake()
 {
     MyDebug.Assert(_image);
     // or with context
     MyDebug.Assert(_image, this);
 }
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

720 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Disable hashing of function names when printing stacktrace to file in unity build 0 Answers

How to properly display debug messages on UI 0 Answers

Problem with unity editor namesapce 1 Answer

Access an Array of class inside another Array of class? (EditorGUILayout) 1 Answer

I want to use a variable in the Unity editor source file to get it from a regular script. 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges