Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > How can i read the stack frames of running process?

Reply
Thread Tools

How can i read the stack frames of running process?

 
 
harshal
Guest
Posts: n/a
 
      10-17-2007
Hi all,

Can we read the stack frame's of the current process.
as we know that whenever a function call is made in c new functions
stack frame
is created and pushed on to the stack. and when the function returns
it is popped out from the stack. i want to know the caller functions
name.

i mean i want something like this

int a()
{
printf("File = %s\n",__FILE__);
/* i want to print the callers name over here. something like this
printf("Caller function = %s\n",__CALLER_FUN__); it should print
b*/
return 0;
}

int b()
{
a();
return 0;
}

int main()
{
b();
}

if there is any way please tell me.

Thanks and Regards
Harshal Shete

 
Reply With Quote
 
 
 
 
Richard Bos
Guest
Posts: n/a
 
      10-17-2007
harshal <(E-Mail Removed)> wrote:

> Can we read the stack frame's of the current process.


In reliable ISO C, you don't even know that you have something called a
"current process"[1], nor a "stack frame", let alone anything that is in
this stack frame's possession. All these details are system-specific,
all functions to read them are necessarily also system-specific, and in
all probability, old systems make doing so a brittle, unreliable process
while more modern systems (wisely) forbid you to put your grubby mitts
inside the running program's data without pre-arranged permission.

> as we know that whenever a function call is made in c new functions
> stack frame is created and pushed on to the stack.


You may think you know that; I think you merely suspect it.

> i want to know the caller functions name.


Pass it. Don't rely on dangerous, unportable, and dirty hackery.

(BTW: in English, the first person singular personal pronoun is
capitalised, except by pretentious bankers like E.E. Cummings.)

> if there is any way please tell me.


There is no way that I would trust with my computer's mental health.

Richard

[1] Unless you touch a live wire.
 
Reply With Quote
 
 
 
 
karthikbalaguru
Guest
Posts: n/a
 
      10-17-2007
On Oct 17, 3:56 pm, harshal <(E-Mail Removed)> wrote:
> Hi all,
>
> Can we read the stack frame's of the current process.
> as we know that whenever a function call is made in c new functions
> stack frame
> is created and pushed on to the stack. and when the function returns
> it is popped out from the stack. i want to know the caller functions
> name.
>
> i mean i want something like this
>
> int a()
> {
> printf("File = %s\n",__FILE__);
> /* i want to print the callers name over here. something like this
> printf("Caller function = %s\n",__CALLER_FUN__); it should print
> b*/
> return 0;
>
> }
>
> int b()
> {
> a();
> return 0;
>
> }
>
> int main()
> {
> b();
>
> }
>
> if there is any way please tell me.
>


You need to understand the architecture of your system, assembly,
compiler very well.
Write a logic in such a way that, you
try parsing throught the generated assembly file and get to know the
function that is calling it.
In the case of M68K there will be something like
JSR _a inside 'b' function.

Karthik Balaguru

 
Reply With Quote
 
harshal
Guest
Posts: n/a
 
      10-17-2007
On Oct 17, 4:09 pm, (E-Mail Removed) (Richard Bos) wrote:
> harshal <(E-Mail Removed)> wrote:
> > Can we read the stack frame's of the current process.

>
> In reliable ISO C, you don't even know that you have something called a
> "current process"[1], nor a "stack frame", let alone anything that is in
> this stack frame's possession. All these details are system-specific,
> all functions to read them are necessarily also system-specific, and in
> all probability, old systems make doing so a brittle, unreliable process
> while more modern systems (wisely) forbid you to put your grubby mitts
> inside the running program's data without pre-arranged permission.
>
> > as we know that whenever a function call is made in c new functions
> > stack frame is created and pushed on to the stack.

>
> You may think you know that; I think you merely suspect it.
>
> > i want to know the caller functions name.

>
> Pass it. Don't rely on dangerous, unportable, and dirty hackery.
>
> (BTW: in English, the first person singular personal pronoun is
> capitalised, except by pretentious bankers like E.E. Cummings.)
>
> > if there is any way please tell me.

>
> There is no way that I would trust with my computer's mental health.
>
> Richard
>
> [1] Unless you touch a live wire.


Can you please explain this in simple words.
from what you are saying it looks like it is nearly impossible.

but my question is that if a function can print its name with
__FUNCTION__
macro then why it can not print its callers name.
then what harm is there with printing its callers name ?

actually i thought of this thing because i want to resolve some memory
leak issues.
and for that purpose i was thinking to print the callers name in
kmalloc.
by the way i am using eCos as operating system.

Thanks and Regards
Harshal


 
Reply With Quote
 
cr88192
Guest
Posts: n/a
 
      10-17-2007

"Richard Bos" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)4all.nl...
> harshal <(E-Mail Removed)> wrote:
>
>> Can we read the stack frame's of the current process.

>
> In reliable ISO C, you don't even know that you have something called a
> "current process"[1], nor a "stack frame", let alone anything that is in
> this stack frame's possession. All these details are system-specific,
> all functions to read them are necessarily also system-specific, and in
> all probability, old systems make doing so a brittle, unreliable process
> while more modern systems (wisely) forbid you to put your grubby mitts
> inside the running program's data without pre-arranged permission.
>


now, this is curious:
I personally do not know of any arch requiring "pre-arranged permission to
put one's grubby mitts in the program's data".

there are a lot of things generally prevented by the OS and hardware, but I
have not heard of this one...


unless of course, by 'pre-arranged permission' you mean 'have to write stuff
in assembler...'.
well, this is true. now, the fun part, is getting the name for the
address...


>> as we know that whenever a function call is made in c new functions
>> stack frame is created and pushed on to the stack.

>
> You may think you know that; I think you merely suspect it.
>


yes, plausible. there is little requiring C compilers, for example, to not
perform inlining, tail-call optimization, and other such tricks...


>> i want to know the caller functions name.

>
> Pass it. Don't rely on dangerous, unportable, and dirty hackery.
>


unless you want to be like me and write your own dynamic compiler framework,
where one comes face to face with this kind of ugly and unportable
hackerry...


now, it is the case, that there is probably no simple answer here either, as
nearly any attempt at an answer would likely also require that the reader
understand what all is going on here.



 
Reply With Quote
 
karthikbalaguru
Guest
Posts: n/a
 
      10-17-2007
On Oct 17, 3:56 pm, harshal <(E-Mail Removed)> wrote:
> Hi all,
>
> Can we read the stack frame's of the current process.
> as we know that whenever a function call is made in c new functions
> stack frame
> is created and pushed on to the stack. and when the function returns
> it is popped out from the stack. i want to know the caller functions
> name.
>
> i mean i want something like this
>
> int a()
> {
> printf("File = %s\n",__FILE__);
> /* i want to print the callers name over here. something like this
> printf("Caller function = %s\n",__CALLER_FUN__); it should print
> b*/
> return 0;
>
> }
>
> int b()
> {
> a();
> return 0;
>
> }
>
> int main()
> {
> b();
>
> }
>
> if there is any way please tell me.
>


You can write some methods based on the MAP file created by Linker and
also using the assembly listing.

Karthik Balaguru

 
Reply With Quote
 
Mark Bluemel
Guest
Posts: n/a
 
      10-17-2007
karthikbalaguru wrote:
> On Oct 17, 3:56 pm, harshal <(E-Mail Removed)> wrote:
>> Hi all,
>>
>> Can we read the stack frame's of the current process.

....
> You can write some methods based on the MAP file created by Linker and
> also using the assembly listing.


I think it's unlikely that anyone capable of doing this would need to
post the question...
 
Reply With Quote
 
Mark Bluemel
Guest
Posts: n/a
 
      10-17-2007
harshal wrote:
> On Oct 17, 4:09 pm, (E-Mail Removed) (Richard Bos) wrote:


> Can you please explain this in simple words.

OK - simple words follow:-

It is very difficult to do in any particular implementation.

It is impossible to produce a general solution.

> from what you are saying it looks like it is nearly impossible.


That's about right.

> but my question is that if a function can print its name with
> __FUNCTION__
> macro then why it can not print its callers name.


The __FUNCTION__ macro is handled by the preprocessor and is simply a
textual replacement at compile time. It's not (terribly) difficult for
the preprocessor to track which function it's processing at a time.

> actually i thought of this thing because i want to resolve some memory
> leak issues.


It can be a useful approach. But unless someone else has already
implemented it, it won't be at all easy...

> and for that purpose i was thinking to print the callers name in
> kmalloc.


I've never heard of kmalloc...

> by the way i am using eCos as operating system.


Then perhaps you could ask in a newsgroup or forum related to that
operating system.
 
Reply With Quote
 
karthikbalaguru
Guest
Posts: n/a
 
      10-17-2007
On Oct 17, 3:56 pm, harshal <(E-Mail Removed)> wrote:
> Hi all,
>
> Can we read the stack frame's of the current process.
> as we know that whenever a function call is made in c new functions
> stack frame
> is created and pushed on to the stack. and when the function returns
> it is popped out from the stack. i want to know the caller functions
> name.
>
> i mean i want something like this
>
> int a()
> {
> printf("File = %s\n",__FILE__);
> /* i want to print the callers name over here. something like this
> printf("Caller function = %s\n",__CALLER_FUN__); it should print
> b*/
> return 0;
>
> }
>
> int b()
> {
> a();
> return 0;
>
> }
>
> int main()
> {
> b();
>
> }
>
> if there is any way please tell me.
>


You can try something as below :
( This is just a rough idea for you . )

You need to know the register that has the address of the current
frame info.
and that address is normally saved to the frame by the called
function.

Create a LIFO list with this info
a) address of the calling function frame
b) return address
c) parameter list

Every function call should add a frame to the list.
Every return from function will delete the frame.

So, if you know the register that has the address of the current frame
info and the
value at that register, then you can make it up on your own.

Also , Many ways are dependent on parsing through the assembly files
and MAP files .

Karthik Balaguru

 
Reply With Quote
 
karthikbalaguru
Guest
Posts: n/a
 
      10-17-2007
On Oct 17, 3:56 pm, harshal <(E-Mail Removed)> wrote:
> Hi all,
>
> Can we read the stack frame's of the current process.
> as we know that whenever a function call is made in c new functions
> stack frame
> is created and pushed on to the stack. and when the function returns
> it is popped out from the stack. i want to know the caller functions
> name.
>
> i mean i want something like this
>
> int a()
> {
> printf("File = %s\n",__FILE__);
> /* i want to print the callers name over here. something like this
> printf("Caller function = %s\n",__CALLER_FUN__); it should print
> b*/
> return 0;
>
> }
>
> int b()
> {
> a();
> return 0;
>
> }
>
> int main()
> {
> b();
>
> }
>
> if there is any way please tell me.
>




You can try something as below :
( This is just a rough idea for you . )

You need to know the system architecture very well for this.

You need to know the register that has the address of the current
frame info.
and that address is normally saved to the frame by the called
function.

Create a LIFO list with info something as below such as for Every
function call that will add a frame to the list.
and for every return from function, it will delete the frame.
a) address of the calling function frame
b) return address
c) parameter list

So, if you know the register that has the address of the current frame
info and the
value at that register, then you can make it up on your own.

Also , Many ways are dependent on parsing through the assembly files
and MAP files .

Karthik Balaguru

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
How can I hide my stack frames in a TestCase subclass? David Banks Python 5 10-05-2012 09:26 AM
Why does std::stack::pop() not throw an exception if the stack is empty? Debajit Adhikary C++ 36 02-10-2011 08:54 PM
C/C++ compilers have one stack for local variables and return addresses and then another stack for array allocations on the stack. Casey Hawthorne C Programming 3 11-01-2009 08:23 PM
stack frame size on linux/solaris of a running application stack Surinder Singh C Programming 1 12-20-2007 01:16 PM



Advertisments