Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Kifa The Great <kifathegreat@gmail.com>
To: gdb@sourceware.org, gcc-help@gcc.gnu.org
Subject: Fwd: Method call and calling convention
Date: Sat, 18 May 2013 12:05:00 -0000	[thread overview]
Message-ID: <CAB35Rs75GPCcoteGWisQSVau+DbC1ZBy5CFJ4jxjvyk7V82=Hw@mail.gmail.com> (raw)
In-Reply-To: <CAB35Rs7t2fYrPunFA+Q_5tW1DxjxdgMLNxHoYNAOatxxwsc4dA@mail.gmail.com>

Hello!
I have faced a problem using GDB with GCC 4.8.0 x86 on Windows XP and
Ubuntu 12.04. Here is the issue description.

GDB has commands to call function from the program being debugged.
They are print and call. But unfortunately the mentioned above
commands work incorrectly for class methods with __thiscall calling
convention. Windows x86 targets are using the __thiscall calling
convention for C++ class-member functions by default from GCC 4.7.
Judging by command return values GDB does not set object address (this
pointer) to ECX registry before method call. So these commands trigger
for some object only if last executed line of the program being
debugged contains method call for the same object. In this case ECX
registry will contain necessary address (this pointer). For methods
with __cdecl calling convention print (call) works perfectly.

Could you please tell me if this is a bug, feature or maybe I do
something wrong?

Thanks,
Petr

C++ program Test:

01: #include <iostream>
02: class Test
03: {
04:    public:
05:        Test(int value) : _value(value) {}
06:        int value() const __attribute__((thiscall)) { return _value; }
07:    private:
08:        int _value;
09:};
10:int main()
11:{
12:    Test test1(123);
13:    Test test2(456);
14:    int value1 = test1.value();
15:    int value2 = test2.value();
16:    std::cout << value1 + value2 << std::endl;
17:    return 0;
18:}

GDB session:

GNU gdb (GDB) 7.5.1-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) file Test
Reading symbols from /home/petr/QtCreator/_Test_gcc4.8/Debug/Test...done.
(gdb) break main
Breakpoint 1 at 0x80487fd: file /home/petr/QtCreator/Test/main.cpp, line 12.
(gdb) run
Starting program: /home/petr/QtCreator/_Test_gcc4.8/Debug/Test
Breakpoint 1, main () at /home/petr/QtCreator/Test/main.cpp:12
12     Test test1(123);
(gdb) next
13     Test test2(456);
(gdb) print test1.value()
$1 = -11264
(gdb) next
14     int value1 = test1.value();
(gdb) print test1.value()
$2 = -11264
(gdb) next
15     int value2 = test2.value();
(gdb) print test1.value()
$3 = 123
(gdb) next
16     std::cout << value1 + value2 << std::endl;
(gdb) print test1.value()
$4 = 456
(gdb) next
579
17     return 0;
(gdb) print test1.value()
$5 = 0
(gdb) continue
Continuing.
[Inferior 1 (process 4180) exited normally]
(gdb)


       reply	other threads:[~2013-05-18 12:05 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CAB35Rs7t2fYrPunFA+Q_5tW1DxjxdgMLNxHoYNAOatxxwsc4dA@mail.gmail.com>
2013-05-18 12:05 ` Kifa The Great [this message]
2013-05-21 16:42   ` Tom Tromey
2013-05-21 18:31     ` Tom Tromey
2013-06-01 20:27       ` Kifa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAB35Rs75GPCcoteGWisQSVau+DbC1ZBy5CFJ4jxjvyk7V82=Hw@mail.gmail.com' \
    --to=kifathegreat@gmail.com \
    --cc=gcc-help@gcc.gnu.org \
    --cc=gdb@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox