Can't debug: assert error with gdb (no problem without)
I'm sorry if the title is really criptic, but I don't know how to phrase my problem.
I know I can't really ask for a solution, and I normally wouldn't but this is really escaping my abilities.
Antefacts.
I developed a program using the zeromq messaging library.
I got to a point where the program works and then started going multithreading: moving a message poller outside of the main thread.
This is supported by the library.
So I devised my thread, passed it a pointer to some parameters (including the pointer to the zmq context) and went ahead.
The Problem
The code in the child thread is the same code I had in the parent, save for the facts that functions parameters are stored in a structure that gets passed to the child.
I followed every function in the child and the parameters are correct.
The code does even work (as it should) when run normally, but hangs with an assert when run in debug.
I tried following every function I could, built the library with debug symbols, using gdb from the console...
I got nothing useful.
I still don't understand why it fails with the debugger attached, and why it runs without.
, I can post the code no problem, this is the smallest minimal example iI couldd devise.
Code:
(android won't let me paste the code... I'll have to get to my computer.
Although even when I'll be able to show you the code, you'll still need the library cited above http://github.com/erupter/saettang
What value do pgm_error->domain and pgm_error->code have?
No matter how I compiled the relative library, the values are optimized out.
I tried explicitly configuring with -O0 but to no avail.
Here is my minimal test code.
It requires the Zmqcpp library found in my github project, as well as ZeroMQ library 3.2.2 compiled with pgm support.
Code:
/*
* File: main.cpp
* Author: erupter
*
* Created on January 9, 2013, 2:03 PM
*/
/*
* File: main.cpp
* Author: erupter
*
* Created on January 9, 2013, 2:03 PM
*/
#include <cstdlib>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <list>
#include <zmqcpp.h>
#define THREAD_CONTROL_IPC "ipc://saetta_th_control"
#define MULTICAST_ADDRESS "239.192.1.1"
#define MULTICAST_PORT 5678
#define ROUTER_PORT 5679
#define HEADER_CTRL "CTRL"
#define HEADER_SERVER_INFO "SERVER_INFO"
using namespace std;
std::string _local_ip_address;
std::stringstream ss;
// custom struct to hold parameters to pass to child threads
struct parameters{
// pointer to context
Zmqcpp::Context * zmqcont;
// function pointer for callbacks
void (*callback) (std::string);
//ip string to connect to
std::string ip;
//if child should bind or connect
int conntype;
//topics to subscribe
std::list<std::string> topics;
};
//child thread
void *th_subscriber (void * params);
//callback
void server_location_callback(std::string ip);
//service function to get the specified interface's address
static inline bool get_iface_address(std::string interf);
/*
*
*/
int main(int argc, char** argv) {
struct parameters myparams;
printf( "Requested interface wlan0, attempting to fetch address...\n");
if (!get_iface_address("wlan0"))
return (EXIT_FAILURE);
//create the pgm address chaining various parameters defined above plus the local ip address of the interface
ss << "epgm://" << _local_ip_address << ";" << MULTICAST_ADDRESS << ":" << MULTICAST_PORT << std::endl;
//create context
Zmqcpp::Context* mycontext = new Zmqcpp::Context(1);
//fill the parameters structure
myparams.ip = ss.str();
ss.str("");
ss.str(HEADER_SERVER_INFO);
myparams.topics.insert(myparams.topics.end(),ss.str());
myparams.conntype = ZMQCPP_CONNECT;
myparams.zmqcont=mycontext;
myparams.callback=&server_location_callback;
//create the connection string for the control socket
ss.str("");
ss << THREAD_CONTROL_IPC;
//create the control socket
Zmqcpp::Publisher *ctrlpublisher = new Zmqcpp::Publisher(mycontext, THREAD_CONTROL_IPC, ZMQCPP_BIND);
//create the child thread
pthread_t th_hndl_subber;
pthread_create(&th_hndl_subber, NULL, th_subscriber, (void *)&myparams);
while(1)
{
//send control messages over the control socket
ctrlpublisher->PubMsg(2,HEADER_CTRL,"Test");
sleep(1);
}
//garbage collection
void *status;
pthread_join(th_hndl_subber, &status);
printf("Main thread cleaning.\n");
ctrlpublisher->~Publisher();
mycontext->~Context();
printf("Main thread cleaned succesfully.");
return (EXIT_SUCCESS);
}
static inline bool get_iface_address(std::string interf)
{
int s;
struct ifreq ifr = {};
s = socket(PF_INET, SOCK_DGRAM, 0);
strncpy(ifr.ifr_name, interf.c_str(), sizeof(ifr.ifr_name));
if (ioctl(s, SIOCGIFADDR, &ifr) >= 0)
{
_local_ip_address = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
printf("Detected interface IP address is %s.\nCreating sockets on this address.\n", _local_ip_address.c_str());
return true;
}
printf("Unable to get interface IP address: is the interface configured?\n");
return false;
}
void *th_subscriber (void * params)
{
//declare some service variables
int th_continue=1;
std::string server_ip;
std::stringstream ss;
std::string msgtype;
std::string msgmaster = HEADER_SERVER_INFO;
std::string temp;
//recast the pointer to the parameter structure
struct parameters *myparams = (struct parameters *) params;
//create the subscriber for the real messages we would like to get
// THIS IS WHAT TRIGGERS THE ASSERT DURING DEBUG
Zmqcpp::Subscriber *msgsubber = new Zmqcpp::Subscriber(myparams->zmqcont,&(myparams->ip), myparams->conntype);
//have it subscribe to each topic we are told to
for (std::list<std::string>::iterator it = myparams->topics.begin(); it != myparams->topics.end(); it++)
{
cout << "Subscribing to <" << *it <<">"<<std::endl;
printf("Subscribing to: <%s>\n",it->c_str());
msgsubber->SubscribeTopic(*it);
}
ss.str("");
ss << THREAD_CONTROL_IPC;
//create the control subscriber over the specified ipc control address and subscribe it
Zmqcpp::Subscriber *ctrlsubber = new Zmqcpp::Subscriber(myparams->zmqcont,THREAD_CONTROL_IPC, ZMQCPP_CONNECT);
ctrlsubber->SubscribeTopic(HEADER_CTRL);
sleep(1);
while(th_continue==1)
{
//do something silly with the control messages
ss.str("");
ss << ctrlsubber->RecvMsg();
msgtype.clear();
msgtype = ss.str();
if (!msgtype.compare(HEADER_CTRL))
{
ss.str("");
ss << "Control message: " << ctrlsubber->RecvMsg();
temp.clear();
temp.assign(ss.str());
myparams->callback(temp.c_str());
if (temp.compare("Control message: KILL")==0)
th_continue=0;
}
}
//child thread garbage collection
printf("Child thread cleaning resources.\n");
ctrlsubber->~Subscriber();
//msgsubber->~Subscriber();
printf("Child thread terminating.\n");
return(EXIT_SUCCESS);
}
void server_location_callback(std::string ip)
{
cout << ip.c_str() << std::endl;
}
If you literally cut&paste the msgsubscriber inside the main thread, obviously modifying the passed parameters, you can both run and debug the code.
As it is you can't.
warning: Source file is more recent than executable.
Not really, I had modified the phrasing of the if to see if gdb behaved any differently. It didn't.
Quote:
Originally Posted by jim mcnamara
Just because gdb shows line #1 of a multiline construct does not mean that line #1 of your if block is the problem.
If you actually want to debug it, break the if's into singletons(this is logical decompostion to monads, so by a theorem by Courcelle):
That's not exactly the problem: the if gives way to a goto statement.
But if any of the conditions triggered the conditional to go fordward, gdb ought to show the call to the goto instruction... at least for what I know.
It instead shows the program as jumping directly to the first line after the goto label.
If then it isn't so, I'll separate the various ifs.
Some background:
The application normally runs on an embedded platform. Currently, for development purposes, I have the rootfs located @ /exports and the target is communicating over NFS. That way I can make a change on my local system, save the application @ /exports, and run the altered... (4 Replies)
Hi,
Can anyone explain this please..... This is on AIX with GDB (tried a few versions). It only happens when program compiled in 64 bit and only with static variables....
A simple test program...
### snip
#include <stdio.h>
main() {
static int n;
n = 6;
printf("hello %d\n", n);... (0 Replies)
I have added some code in my file.
I have created executable rpm file of our code and also I have created debuginfo and debugsource files and installed all three.
But when I debug in gdb I see the the code changes in soucre file. But the break point does not hit at that place as if it did not... (1 Reply)
I hope this is the right thread - not sure if it belongs in the Linux forum. Anyway, I'm having an issue with ddd and gdb. When using ddd to run gdb, there are extra parameters being appended, and my program is picking them up.
I'm running on Ubuntu 11.04...
Here's my command line entry -
... (1 Reply)
Hi All
I know How to attach a process to beubg it .But for my application I am using client as well server.Both are two separate process .Suppose I need to debug both .How to attach both of them together .Or I have to attach them separetly .
Suppose client process id is 1325 and server is... (2 Replies)
Hi all,
(gdb) target remote 192.168.185.196:1389
Remote debugging using 192.168.185.196:1389
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x2fbd0800 in ?? ()
(gdb) l
1 ... (0 Replies)
I created one file (test.cpp)and complied it and get the executable file(test) and run it.It is giving the out put but when I am trying to debug that executable.I am getting the error --
please tell me the solutions??
Thanks in advance ..... (2 Replies)
If an executalbe file has several parameters, gdb can not pass parameters correctly. Let us see:
run:
./executablefile1 agr1 arg2 arg3
debug:
gdb executablefile1
run executalbefile1 arg1 arg2 arg3
then argv : executablefile1
argv : executablefile
argv : arg1
... (3 Replies)
I have to compile gnu-gdb 6.7 on HP-UX 11.11 with /usr/local/pa64/bin/gcc 64-bit compiler, but I'm having some problems during "make":
ser-tcp.c: In function `net_open':
ser-tcp.c:207: warning: passing arg 5 of `getsockopt' from incompatible pointer type
make: *** Error 1
make: Leaving... (8 Replies)
Hi,
I don't know if this is HP-UX specific, but I'll take my chances with this forum. ;)
I'm using WDB 5.7 on HP Itanium 11.23.
'file' on my executable shows:
ELF-32 executable object file - IA64
The problem is with viewing the contents of the variables.
Following is a sequence that... (0 Replies)