From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4761 invoked by alias); 19 Jan 2009 17:53:36 -0000 Received: (qmail 4748 invoked by uid 22791); 19 Jan 2009 17:53:36 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-bw0-f13.google.com (HELO mail-bw0-f13.google.com) (209.85.218.13) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 19 Jan 2009 17:53:28 +0000 Received: by bwz6 with SMTP id 6so8155135bwz.0 for ; Mon, 19 Jan 2009 09:53:25 -0800 (PST) MIME-Version: 1.0 Received: by 10.181.199.11 with SMTP id b11mr574544bkq.105.1232387401005; Mon, 19 Jan 2009 09:50:01 -0800 (PST) Date: Mon, 19 Jan 2009 17:53:00 -0000 Message-ID: Subject: single-step SIGALRM issue From: Laszlo Benedek To: gdb@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes 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 X-SW-Source: 2009-01/txt/msg00106.txt.bz2 Hi, I am part of a team developing a simulator and we have problems debugging the simulator with gdb. The simulator is an application written for x86-linux and it was written in c/c++. It uses the SIGALRM signal to simulate interrupts. The test that fails: I start the simulator in gdb and insert a breakpoint at a certain function call. When the program reaches the breakpoint it correctly stops, then I try to use single stepping. At this point something wierd happens, sometimes it works fine and I can use the step command but sometimes the program starts to run and then hangs. I tried to find the reason of this and here is what I've found. When gdb starts single stepping it is expecting a SIGTRAP signal but sometimes it receives a SIGALRM instead. In this case it decides to switch the inferior in 'continue' mode, inserts a breakpoint and waits. In this case our program continues to run from the original breakpoint and eventually it reaches a point where it calls sigsuspend and it waits for signals but it does not receive any signals anymore. It seems that gdb is blocking them somehow when this single-step => continue switch happens. I read the comment in the gdb source and it says that gdb expects that the program's signal handler will be called and it will stop at the return of the signal handler because gdb just inserted a breakpoint there. For some reason the signal handler of our program is not called at all after it gets into this 'continue' mode. I'd like to fix this or at least decide if this is an error in gdb or in the simulator (or both?), but I don't really know how to continue. Has anyone experienced anything like this before ? Any comment, idea would be appreciated. Thanks for your help in advance! Best regards, Laszlo Benedek