C++ Debuggen

Hi,

ich finde irgendwie nichts ( also die Frage schon, nur keine richtige Antwort ) wie ich ein C++ Programm mit dem GDB debuggen kann.

Code:
class Test
{
	private:
		void print(void)
		{
			printf("Hallo\n");
		}
};

int main(void)
{
	Test p;
	return 0;
}

Ich würde nun z.B. gerne mit disas mit den Code von Test::print() anschauen, wie mach ich das ?
 
Okay, wenn ich nun ein "break 4" mache, was habe ich davon ?

Ich will ja davon den wie in einem C Programm mit disas den Code anschauen ?
 
Kannst du mir nicht auf meine Frage antworten oder willst du mir nicht auf meine Frage antworten.

Ich möchte gerne wissen :

Hi,

ich finde irgendwie nichts ( also die Frage schon, nur keine richtige Antwort ) wie ich ein C++ Programm mit dem GDB debuggen kann.
Code:
class Test
{
	private:
		void print(void)
		{
			printf("Hallo\n");
		}
};

int main(void)
{
	Test p;
	return 0;
}
Ich würde nun z.B. gerne mit disas mit den Code von Test::print() anschauen, wie mach ich das ?

Ist doch eine klare Frage oder ;)

Einfach einen Breakpoint auf deine print-Funktion setzen.

Ist keine Antwort auf meine Frage !

Warum kompilierst du nicht einfach mit 'g++ -S'? Dann bekommst du deinen Assembler-Code.

Ist keine Antwort auf meine Frage !

Mich interessiert nicht nur der ASM Code sondern die gesamte Ausgabe vom GDB

Code:
class Test
{
	private:
		void print(void)
		{
			printf("print()\n");
		}
};

void xprint(void)
{
	printf("xprint()\n");
}

int main(void)
{
	return 0;
}

(gdb) disas xprint
Dump of assembler code for function _Z6xprintv:
0x0804846e <_Z6xprintv+0>: push %ebp
0x0804846f <_Z6xprintv+1>: mov %esp,%ebp
0x08048471 <_Z6xprintv+3>: sub $0x8,%esp
0x08048474 <_Z6xprintv+6>: movl $0x804854c,(%esp)
0x0804847b <_Z6xprintv+13>: call 0x80483a8 <puts@plt>
0x08048480 <_Z6xprintv+18>: leave
0x08048481 <_Z6xprintv+19>: ret
End of assembler dump.
(gdb) disas Test:print
No symbol "Test" in current context.
(gdb) disas print
No symbol "print" in current context.
(gdb)
 
Original von Dawen
Original von mauralix
Hast du kein Visual Studio?

Da bei mir in der Firma momentan alles auf ein anderes neues Projekt umgestellt wird, habe ich momentan nicht mal Windows ;)

Aber wie würde ich es unter Visual Studio machen ?

Das ist kinderleicht. An der Stelle wo den Breakpoint haben willst links doppelt hinklicken oder F9 Drücken. Visual Studio bietet eigene Buttons zum Durchsteppen. Ansonsten stepst du mit F10 bzw. F11 durch.
 
Wie jetzt ... möchtest due wissen WIE die Funktion printf() aufgebaut ist in dem du debuggst ?? ....

C++ Builder ..( und auch bei anderen ) einfach ein Breakpint setzen wie schon 3 mal gesagt wurde... und dann F7 drücken um in die funktion zu gehen.

Ansonsten wenn das nicht die richtige antwort ist musst du deine frage neu formulieren. weil ich hab deine frage am anfang gar nicht verstanden.

hadebakalem ciaaao
 
Hmm, stimmt, da die Funktion private ist und nirgendwo aufgerufen wird (z.B. im Klassen-Konstruktor, bringt ein Breakpoint wenig und gdb kennt diese Funktion auch nicht. Hatte ich nicht drauf geachtet.

In diesem Fall ist die Antwort auf deine Frage... Du kannst diese Funktion nicht debuggen. Um sie debuggen zu können muss sie public sein und im Programmfluss aufrufbar. Der Code muss also so ausshen, damit du die Funktion disassemblieren kannst:

Code:
#include <iostream>

class Test
{
public:
  void print(void)
    {
      printf("Hallo\n");
    }
};

int main(void)
{
  Test p;
  p.print();
  return 0;
}

Dann kannst du die Funktion disassemblieren:

Code:
bitmuncher@admin-laptop:~$ g++ -o test -ggdb test.cpp
bitmuncher@admin-laptop:~$ gdb ./test
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) disas Test::print
Dump of assembler code for function _ZN4Test5printEv:
0x080485f0 <_ZN4Test5printEv+0>:        push   %ebp
0x080485f1 <_ZN4Test5printEv+1>:        mov    %esp,%ebp
0x080485f3 <_ZN4Test5printEv+3>:        sub    $0x8,%esp
0x080485f6 <_ZN4Test5printEv+6>:        movl   $0x80486cc,(%esp)
0x080485fd <_ZN4Test5printEv+13>:       call   0x80484a8 <puts@plt>
0x08048602 <_ZN4Test5printEv+18>:       leave
0x08048603 <_ZN4Test5printEv+19>:       ret
End of assembler dump.
(gdb)

oder halt einen Breakpoint setzen und dann beim Stop des Programmablaufs disas anwenden.

Code:
(gdb) break Test::print
Breakpoint 1 at 0x80485f6: file test.cpp, line 8.
(gdb) run
Starting program: /home/bitmuncher/test

Breakpoint 1, Test::print (this=0xbfdb43f3) at test.cpp:8
8             printf("Hallo\n");
(gdb) disas
Dump of assembler code for function _ZN4Test5printEv:
0x080485f0 <_ZN4Test5printEv+0>:        push   %ebp
0x080485f1 <_ZN4Test5printEv+1>:        mov    %esp,%ebp
0x080485f3 <_ZN4Test5printEv+3>:        sub    $0x8,%esp
0x080485f6 <_ZN4Test5printEv+6>:        movl   $0x80486cc,(%esp)
0x080485fd <_ZN4Test5printEv+13>:       call   0x80484a8 <puts@plt>
0x08048602 <_ZN4Test5printEv+18>:       leave
0x08048603 <_ZN4Test5printEv+19>:       ret
End of assembler dump.
(gdb)
 
Zurück
Oben