From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28352 invoked by alias); 18 May 2013 12:05:12 -0000 Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org Received: (qmail 28329 invoked by uid 89); 18 May 2013 12:05:12 -0000 X-Spam-SWARE-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,KHOP_THREADED,RCVD_IN_DNSWL_NONE,RCVD_IN_HOSTKARMA_YE,RCVD_IN_SEMBACKSCATTER,SPF_PASS autolearn=ham version=3.3.1 Received: from mail-pd0-f196.google.com (HELO mail-pd0-f196.google.com) (209.85.192.196) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sat, 18 May 2013 12:05:11 +0000 Received: by mail-pd0-f196.google.com with SMTP id v10so1349341pde.3 for ; Sat, 18 May 2013 05:05:09 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.68.78.37 with SMTP id y5mr52087633pbw.28.1368878709856; Sat, 18 May 2013 05:05:09 -0700 (PDT) Received: by 10.68.229.138 with HTTP; Sat, 18 May 2013 05:05:09 -0700 (PDT) In-Reply-To: References: Date: Sat, 18 May 2013 12:05:00 -0000 Message-ID: Subject: Fwd: Method call and calling convention From: Kifa The Great To: gdb@sourceware.org, gcc-help@gcc.gnu.org Content-Type: text/plain; charset=ISO-8859-1 X-SW-Source: 2013-05/txt/msg00080.txt.bz2 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 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 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: . (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)