By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
434,668 Members | 1,503 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 434,668 IT Pros & Developers. It's quick & easy.

Get the name of the calling function of an executing function

P: n/a
Hi, I want to get the name of the calling function of an executing function,
I use the StackTrace class to do this and it seems working. However, does
anyone think that there any side effect towards this approach such as how
would it works in multi-thread.

Thanks
Tony


// call the HI method from somewhere.

private void HI(){
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(1);
System.Diagnostics.StackFrame sf = st.GetFrame(0);
string msg = sf.GetMethod().DeclaringType.FullName + "." +
sf.GetMethod().Name;
MessageBox.Show( msg );
}
Nov 13 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
Tony Liu <en*******@hotmail.com> wrote:
Hi, I want to get the name of the calling function of an executing function,
I use the StackTrace class to do this and it seems working. However, does
anyone think that there any side effect towards this approach such as how
would it works in multi-thread.


Multithreading shouldn't have any effect. Things which might:

o JIT inlining could remove some stack frames
o This method may well slow things down considerably - don't try to use
it in intensive code

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet/
If replying to the group, please do not mail me too
Nov 13 '05 #2

P: n/a
Hi Tony,

Since each thread has its own stack, StackTrace will work in multiple
threads just as it does in single thread. Here I have a demo, you may
create a new C# Windows application project, and modify Form1.cs as follows.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;
using System.Diagnostics;
namespace test1
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after
InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
private void HI()
{
System.Diagnostics.StackTrace st = new
System.Diagnostics.StackTrace(1);
System.Diagnostics.StackFrame sf = st.GetFrame(0);
string msg = sf.GetMethod().DeclaringType.FullName
+ "." +
sf.GetMethod().Name;
MessageBox.Show(msg);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new
System.Drawing.Point(80, 216);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new
System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5,
13);
this.ClientSize = new System.Drawing.Size(292,
273);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
public void test()
{
HI();
}
public void test2()
{
HI();
}
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs
e)
{
Thread InstanceCaller = new Thread(new
ThreadStart(this.test));
// Start the thread.
InstanceCaller.Start();
Thread StaticCaller = new Thread(new
ThreadStart(this.test2));
// Start the thread.
StaticCaller.Start();

}
}
}
Hope this will help you.
--------------------
From: Jon Skeet <sk***@pobox.com>
Subject: Re: Get the name of the calling function of an executing function
Date: Wed, 9 Jul 2003 09:58:35 +0100
Message-ID: <MP************************@news.microsoft.com>
References: <ez**************@TK2MSFTNGP11.phx.gbl>
Organization: Peramon Technology Ltd.
X-Newsreader: MicroPlanet Gravity v2.60
Newsgroups: microsoft.public.dotnet.languages.csharp
NNTP-Posting-Host: fw.peramon.com 193.132.195.125
Lines: 1
Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftn gp13.phx.gbl
Xref: cpmsftngxa06.phx.gbl microsoft.public.dotnet.languages.csharp:167858
X-Tomcat-NG: microsoft.public.dotnet.languages.csharp

Tony Liu <en*******@hotmail.com> wrote:
Hi, I want to get the name of the calling function of an executing function, I use the StackTrace class to do this and it seems working. However, does anyone think that there any side effect towards this approach such as how
would it works in multi-thread.


Multithreading shouldn't have any effect. Things which might:

o JIT inlining could remove some stack frames
o This method may well slow things down considerably - don't try to use
it in intensive code

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet/
If replying to the group, please do not mail me too


Nov 13 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.