Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I want to run two machine:

  1. debugged machine: compiled kernel with kgdb option.
  2. debugger machine: for running gdb

How can I debug machine 1 from machine 2?

share|improve this question
    
What have you done this far? Have you setup your machine to be debugged with a serial console which is reachable from your debugger machine? –  Sami Laine Dec 15 '13 at 10:55
    
@SamiLaine Yes I've. I can debug my machine that need to be debugged from serial console in host machine. but I need run two virtual machine and debug one of them through another. –  Khajavi Dec 15 '13 at 10:58
    
I think you should mention that you're using virtual machines in the question, that helps a lot. The actual solution depends partially on which virtualization technology (e.g. Xen or VMware) you're using. –  Sami Laine Dec 15 '13 at 11:06
    
@SamiLaine I think I need to convert serial console to socket, in my host machine so I can debug one vm machine from another vm machine. –  Khajavi Dec 15 '13 at 11:10
    
@SamiLaine I'm using this tutorial: fotisl.com/blog/?p=25 I've compiled kernel by kgdb option (vm machine A) and now I can connect the gdb by serial console to machine A. but now I need to run new vm machine B, and then through machin B, debug machine A. –  Khajavi Dec 15 '13 at 11:17
add comment

1 Answer

gdbserver

Sounds like you're looking for gdbserver.

gdbserver is a control program for Unix-like systems, which allows you to connect your program with a remote GDB via target remote---but without linking in the usual debugging stub.

Example

On the target machine

You need to have a copy of the program you want to debug. gdbserver does not need your program's symbol table, so you can strip the program if necessary to save space. GDB on the host system does all the symbol handling.

target$ gdbserver host:2345 emacs foo.txt

NOTE: You can also attach to running processes like so:

target$ gdbserver comm --attach pid

One the GDB host machine

You need an unstripped copy of your program, since GDB needs symbols and debugging information. Start up GDB as usual, using the name of the local copy of your program as the first argument. (You may also need the --baud' option if the serial line is running at anything other than 9600bps.) After that, use target remote to establish communications with gdbserver. Its argument is either a device name (usually a serial device, like/dev/ttyb'), or a TCP port descriptor in the form host:PORT. For example:

   (gdb) target remote the-target:2345

GDB stub

There is another method discussed in the manuals, called "remote stub". The official manuals are located here, GDB Documentation, on the gnu.org website. Looking through the GDB Users Manual, section 20.5, Implementing a Remote Stub, explains how to use this feature instead of gdbserver.

This method is described as follows in the docs:

The next step is to arrange for your program to use a serial port to communicate with the machine where gdb is running (the host machine). In general terms, the scheme looks like this:

So you might be able to setup a serial port on both the VM host and the guest and debug the guest's kernel using this method.

References

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.