On Sun, Mar 23, 2014 at 4:29 PM, Piotr Rak <[email protected]> wrote:
> Sorry I misinformed you about posix_spawn - it is not true for Linux and > FreeBSD at least, it will use ordinary fork. > > > 2014-03-23 15:23 GMT+01:00 Piotr Rak <[email protected]>: > > >> Hi, >> >> 2014-03-23 14:04 GMT+01:00 Eran Ifrah <[email protected]>: >> >> Thanks for your pointer Piotr. Here is the code I am using to open a >>> pseudo-terminal (there is the UI part, which I left out): >>> >>> char __name[128]; >>> memset(__name, 0, sizeof(__name)); >>> >>> int master(-1); >>> m_slave = -1; >>> if(openpty(&master, &m_slave, __name, NULL, NULL) != 0) >>> return wxT(""); >>> >>> // disable ECHO >>> struct termios termio; >>> tcgetattr(master, &termio); >>> termio.c_lflag = ICANON; >>> termio.c_oflag = ONOCR | ONLRET; >>> tcsetattr(master, TCSANOW, &termio); >>> >>> m_tty = wxString(__name, wxConvUTF8); >>> >>> At the end, m_tty contains a string name (e.g. /dev/pts/19 ). >>> Note that the above code works flawlessly when using it with gdb (i.e. if >>> I pass this "/dev/pts/19" to gdb's switch -tty=/dev/pts/19 I will get >>> all the inferior output/err/input to my internal terminal) >>> >>> However, doing the same with LLDB (using C++ API not the command line , >>> i.e. passing "/dev/pts/19" as an argument to SBTarget::Launch(...)) I get >>> nothing as output... >>> >>> Looks sane to me. >> >> >>> Also, I am not sure I am following the idea behind replacing the >>> "Launch" function with my own fork(), looking at the code of Launch() >>> suggests that it does more than a simple fork... >>> >>> >> That was my idea to debug issue if nothing else helps. >> Or rather bisect on which side it really is, sorry if I did not make it >> clear... >> So I was trying suggest replacing SBTarget::Launch with fork, write to >> child stdout/err, and see if that works alone.... >> >> SBTarget::Launch is usually actually posix_spawn right now, it uses >> posix_spawnattr_addopen to open descriptors for your specified paths, and >> should open it 3 times - given current implementation - even it is just one >> file. >> >> Have you inspected SBProcess and SBError returned by SBTarget::Launch? >> >> I checked IsValid() on both and its OK for both. I can actually run "next" Continue etc and seems to be working. Its just that I can't seem to redirect the stdout/err to my own console. Do you see your inferior process is indeed launching, just not displaying >> anything? >> > Yes, ps -ef shows the debugee > >> Do you have an option to check if those terminals are actually being >> opened (like examining /proc/<pid>/fd for linux)? >> > The terminal is opened. Like I mentioned in my previous email, using the _same_ code with gdb works I also have a standalone terminal application which I wrote which is also using the same set of classes all of the are working for couple of years now without any problems I also tried this: I typed in my konsole 'tty' and used that as the input for Launch - it also seems to have no effect >> Good luck, >> /Piotr >> >> Any more hints? >>> Eran >>> >>> >>> >>> On Sat, Mar 22, 2014 at 9:36 PM, Piotr Rak <[email protected]> wrote: >>> >>>> Hi, >>>> >>>> It should. >>>> Have you opened master pseudoterminal like?: >>>> >>>> int fd = posix_openpt(flags); // open("/dev/ptmx") might work here >>>> too but less portable; >>>> grantpt(fd); >>>> unlockpt(fd); >>>> >>>> Depending on target you might need some bizarre ioctls here, but >>>> assuming you are using Linux/FreeBSD/MacOSX >>>> you should be fine. >>>> >>>> If you had already master pseudo-terminal file descriptor you can skip >>>> steps above. >>>> >>>> You can use ptsname for master file descriptor it will return you name >>>> of slave pseudo-terminal for your master. >>>> Later you can pass name returned by ptsname(fd) as Launch arguments. >>>> >>>> If above won't work you can try replacing Launch() call with ordinary >>>> fork, and in child process: >>>> >>>> slavefd = open(slavename, O_RDWR); >>>> >>>> dup2(0, slavefd); >>>> dup2(1, slavefd); >>>> dup2(2, slavefd); >>>> >>>> And see if that works alone for you... >>>> >>>> Good luck, >>>> /Piotr >>>> >>>> >>>> 2014-03-22 19:29 GMT+01:00 Eran Ifrah <[email protected]>: >>>> >>>>> Hello, >>>>> >>>>> I am trying to use the C++ API with good success so far. >>>>> I am now at a point where I want to redirect stdin/out/err of the >>>>> inferior to my application (my application creates a separate pseudo >>>>> terminal window) >>>>> >>>>> Looking at the SBTarget::Launch, I thought that simply passing >>>>> "/dev/pts/<some-number>" as the 3rd, 4th and 5th argument will do the >>>>> trick >>>>> .. well, it did not. >>>>> I am missing something basic here, can anyone shed some light please? >>>>> or give an example (better) of how to achieve this? >>>>> >>>>> Thanks! >>>>> >>>>> -- >>>>> Eran Ifrah >>>>> Author of codelite, a cross platform open source C/C++ IDE: >>>>> http://www.codelite.org >>>>> wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org >>>>> >>>>> _______________________________________________ >>>>> lldb-dev mailing list >>>>> [email protected] >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev >>>>> >>>>> >>>> >>> >>> >>> -- >>> Eran Ifrah >>> Author of codelite, a cross platform open source C/C++ IDE: >>> http://www.codelite.org >>> wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org >>> >> >> > -- Eran Ifrah Author of codelite, a cross platform open source C/C++ IDE: http://www.codelite.org wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org
_______________________________________________ lldb-dev mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
