2011-09-13 12 views
7

Un po 'di tempo fa ho cambiato il mio sistema operativo personale in Linux e il mio ambiente di sviluppo in KDevelop.KDevelop debugging warning: Impossibile impostare il terminale di controllo: operazione non consentita

Tuttavia, il debug di progetti C++ non funziona ancora come dovrebbe. La mia versione è KDevelop 4.2.2 (ho installato attraverso la gestione dei pacchetti)

Ogni volta che ho colpito il tasto "debug" l'applicazione sta iniziando con il messaggio console warning: GDB: Failed to set controlling terminal: Operation not permitted e funzionalità di debug non è disponibile.

Tutte le idee sono benvenute.

(Se avete bisogno di ulteriori informazioni non esitate a chiedere)

+0

soli * * nitpick Googling quell'avvertimento dà colpi 6k realtà. –

+0

I googled tale avvertimento, ma non ero in grado di risolvere it- questo è il motivo per cui ho scritto questo post. – Mythli

+0

Le persone usano ancora KDevelop? Non ho toccato che come 10 anni ... –

risposta

20

Ho anche avuto questo problema, ma io uso gdb in KDevelop abbastanza poco che non mi aveva ancora preso la briga. Ecco il mio log di provare a risolverlo:

Grepping tramite il GDB 7.3.1 il codice sorgente rivela che questo messaggio viene stampato quando GDB tenta di impostare il proprio TTY principale su uno pseudo-tty appena creato (vedere gdb/inflow. c, righe 683-740). In particolare, una chiamata a ioctl con richiesta TIOCSCTTY fallisce con un errore di autorizzazione.

Con questo in mente, ho dato un'occhiata al codice sorgente del kernel di Linux per vedere cosa potrebbe causare un errore. Un po 'di ricerca mostra che alla fine degenererà in una chiamata a tiocsctty(). Il commento da tiocsctty che è importante qui:

/* 
* The process must be a session leader and 
* not have a controlling tty already. 
*/ 

Dal momento che l'unico altro motivo può riuscire con EPERM è se il tty che GDB crea è in realtà un terminale di controllo per un'altra processo (che sembra altamente improbabile), Ho pensato che fosse ragionevole supporre che GDB non fosse un leader di sessione. Dopo tutto, è stato lanciato da KDevelop!

Quindi: Ho provato non lanciare la sessione GDB in un terminale esterno, e funziona. Problema ristretto.

In origine, la linea di terminale esterna è stata impostata su konsole --noclose --workdir %workdir -e %exe. La modifica di questa a terminator -e %exe fatto una leggera differenza: KDevelop mi ha avvertito che

GDB cannot use the tty* or pty* devices. 
Check the settings on /dev/tty* and /dev/pty* 
As root you may need to "chmod ug+rw" tty* and pty* devices and/or add the user to the tty group using "usermod -G tty username". 

Ho controllato il mio permessi; il mio utente faceva parte del gruppo tty e tutti i file rilevanti erano leggibili e scrivibili.

Grepping tramite il codice sorgente di KDevelop rivela come KDevelop imposta effettivamente il terminale. Esegue lo script shell

tty > FIFO_PATH ; trap "" INT QUIT TSTP ; exec<&-; exec>&-; while :; do sleep 3600;done 

e quindi imposta GDB per utilizzare il dispositivo terminale legge da FIFO_PATH. (Il mio nome, a proposito, non è quello che usa KDevelop.) Il problema (come meglio posso dire) è che gdb non viene lanciato come figlio dello script di shell, e quindi non può usarlo come suo tty principale.

Non mi sento in grado di applicare patch a KDevelop per farlo funzionare correttamente (o trovare ciò che effettivamente ha causato questo smettere di funzionare in primo luogo ...), quindi il meglio che posso suggerire al momento è semplicemente non usare un terminale esterno per scopi di debug.

Buona fortuna! Aggiornerò se trovo qualcosa di utile.

+2

e hai solo 54 per la risposta ?! amico che va subito sul mio twitter! Che bella/feedback perfetto –

+0

purtroppo non si usa un terminale esterno non è un'opzione per le persone il debug di un'applicazione ncurses – Daniel

0

Nel caso in cui avete ottenuto l'errore:

"Can't receive konsole tty/pty. Check that konsole is actually a terminal and that it accepts these arguments"

RUN> Configura LAUCHERS> (vedi foto sotto il mio nome progetto è stato "loop".)
Quello che ha funzionato per me è stato quello di deselezionare casella di controllo "Uso esterno Terminale". Trovato nella scheda "Binari compilati".

RUN > Configure Laucher

Problemi correlati