File: CodeLiteLLDB.cpp

package info (click to toggle)
codelite 14.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 112,816 kB
  • sloc: cpp: 483,662; ansic: 150,144; php: 9,569; lex: 4,186; python: 3,417; yacc: 2,820; sh: 1,147; makefile: 52; xml: 13
file content (144 lines) | stat: -rw-r--r-- 4,530 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// copyright            : (C) 2014 Eran Ifrah
// file name            : CodeLiteLLDB.cpp
//
// -------------------------------------------------------------------------
// A
//              _____           _      _     _ _
//             /  __ \         | |    | |   (_) |
//             | /  \/ ___   __| | ___| |    _| |_ ___
//             | |    / _ \ / _  |/ _ \ |   | | __/ _ )
//             | \__/\ (_) | (_| |  __/ |___| | ||  __/
//              \____/\___/ \__,_|\___\_____/_|\__\___|
//
//                                                  F i l e
//
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 2 of the License, or
//    (at your option) any later version.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

#include <wx/init.h>
#include "CodeLiteLLDBApp.h"
#include <unistd.h>
#ifndef __WXMSW__
#include <sys/wait.h>
#endif
#include <lldb/API/SBDebugger.h>
#include <wx/filename.h>
#include <wx/wxcrtvararg.h>

static wxString s_localSocket;
void OnTerminate(int signo)
{
    // Remove the socket path
    if ( !s_localSocket.IsEmpty()) {
        wxPrintf("codelite-lldb: removing socket file '%s'\n", s_localSocket);
        ::remove( s_localSocket.mb_str(wxConvUTF8).data() );
        wxPrintf("codelite-lldb: bye\n");
        exit(0);
        
    } else {
        // Kill our child process and exit
        wxPrintf("codelite-lldb: bye\n");
        exit(0);
    }
}

void PrintUsage()
{
    printf("Usage:\n");
    printf("codelite-lldb -s </path/to/socket>\n");
    printf("codelite-lldb -t <ip:port>\n");
    printf("codelite-lldb -h\n");
}

int main(int argc, char** argv)
{
    wxInitializer intializer(argc, argv);

    // Register some signal handlers
    signal(SIGTERM, OnTerminate);
    signal(SIGABRT, OnTerminate);
    signal(SIGINT,  OnTerminate);
#ifndef __WXMSW__
    signal(SIGPIPE, SIG_IGN);
#endif
    // Parse command line
    int c;
    wxString tcpConnectString;
    while ((c = getopt (argc, argv, "hs:t:")) != -1) {
        switch(c) {
        case 's':
            s_localSocket = optarg;
            break;

        case 't':
            tcpConnectString = optarg;
            break;

        case 'h':
            PrintUsage();
            exit(EXIT_SUCCESS);

        default:
            break;
        }
    }

    if (s_localSocket.IsEmpty() && tcpConnectString.IsEmpty() ) {
        PrintUsage();
        exit(EXIT_FAILURE);
    }
    
    // Initialize SBDebugger
    lldb::SBDebugger::Initialize();
    
    if ( !s_localSocket.IsEmpty() ) {
        // Start on local socket
        CodeLiteLLDBApp app(s_localSocket);
        app.MainLoop();

        wxPrintf("codelite-lldb: removing socket file '%s'\n", s_localSocket);
        ::remove( s_localSocket.mb_str(wxConvUTF8).data() );
        wxPrintf("codelite-lldb: bye\n");
        
    } else if ( !tcpConnectString.IsEmpty() ) {
        // TCP/IP mode, redirect stdout/err
        // wxFileName stdout_err(::wxGetHomeDir(), ".codelite-lldb-stdout-stderr.log");
        // FILE* new_stdout = ::freopen(stdout_err.GetFullPath().mb_str(wxConvISO8859_1).data(), "w+b", stdout);
        // FILE* new_stderr = ::freopen(stdout_err.GetFullPath().mb_str(wxConvISO8859_1).data(), "w+b", stderr);
        // wxUnusedVar(new_stderr);
        // wxUnusedVar(new_stdout);

        // parse the connect string
        long portNum;
        wxString ip_addr    = tcpConnectString.BeforeFirst(':');
        wxString port_str   = tcpConnectString.AfterFirst(':');
        port_str.ToCLong( &portNum );
        
        wxString invocationLine;
        invocationLine << argv[0] << " -t " << tcpConnectString << "'";
        
        // Connect using tcp-ip
        // When using tcp-ip we fork the child process and wait until it terminates
        // Child code
        {
            // this must be in a scope so that 'app' will get destroyed before we create new instance
            CodeLiteLLDBApp app(ip_addr, portNum);
            app.MainLoop();
        }

        // Restart ourslef ( lldb does not clear nicely :( )
        ::wxExecute(invocationLine);
        exit(EXIT_SUCCESS);
    }

    return 0;
}