﻿define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>/dev/head &#187; gdb</title>
	<atom:link href="http://devhead.ru/cat/gdb/feed" rel="self" type="application/rss+xml" />
	<link>http://devhead.ru</link>
	<description>Статьи и видео уроки</description>
	<lastBuildDate>Mon, 30 Jan 2017 11:12:34 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.37</generator>
	<item>
		<title>Способы отладки gdb&#8217;ом или ddd&#8217;ом приложения с fork()</title>
		<link>http://devhead.ru/main/sposoby-otladki-gdbom-ili-dddom-prilozheniya-s-fork</link>
		<comments>http://devhead.ru/main/sposoby-otladki-gdbom-ili-dddom-prilozheniya-s-fork#comments</comments>
		<pubDate>Thu, 08 Nov 2012 06:22:04 +0000</pubDate>
		<dc:creator><![CDATA[andreykyz]]></dc:creator>
				<category><![CDATA[Главная]]></category>
		<category><![CDATA[Статьи]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[fork]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[баг]]></category>
		<category><![CDATA[Си]]></category>

		<guid isPermaLink="false">http://devhead.ru/?p=1637</guid>
		<description><![CDATA[Я разрабатываю клиент серверное приложение на языке программирования C (Си). У меня как и у всех разработчиков возникает необходимость запуска приложения под отладчиком. В однопоточном приложении и приложении с thread'ами (нитями) все достаточно стандартно - просто запускаем его через $ gdb мое_приложение. Но в случае если отладчик наткнется на вызов fork() он переключится на parent [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Я разрабатываю клиент серверное приложение на языке программирования C (Си). У меня как и у всех разработчиков возникает необходимость запуска приложения под отладчиком. В однопоточном приложении и приложении с thread'ами (нитями) все достаточно стандартно - просто запускаем его через $ gdb мое_приложение. Но в случае если отладчик наткнется на вызов fork() он переключится на parent (родитель) процесс, хотя обычно, в демонах, после первого fork()'а родитель завершает свою работу и по смылу нужно отлаживать child процесс. Для ddd и gbd можно писать скрипты при помощи которых можно указывать отладчику идти по parent пути или по child, также можно цепляться уже к запущенному и работающему приложению. Сейчас мы и разберем все эти способы отладки.</p>
<p><span id="more-1637"></span></p>
<h3>Отладка с выбором пути следования по вызовам fork()</h3>
<p>Первый способ, он описан в <a href="http://www.delorie.com/gnu/docs/gdb/gdb_26.html" target="_blank">документации к gdb.</a> Весь смысл метода в том чтобы описать по какой ветке идти после вызова fork() и скормить это описание отладчику. Вот пример кода для запуска под отладчиком:</p>
<pre class="brush: cpp">#include
#include
#include
#include 

#define I_CHILD 1
#define I_PARENT 2

void dummy_function(int who_i) {
    pid_t pid;
    if (who_i == I_CHILD) {
        printf("Child after first fork() call dummy_function() my pid is %i\n", getpid());
    } else {
        printf("Parent after first fork() call dummy_function() my pid is %i\n", getpid());
    }
    switch (pid = fork()) {
    case -1:
        printf("Second fork() ERROR\n");
        if (errno == ENOMEM) {
            printf("Memory is tight\n");
        }
        exit(-1);
    case 0:
        printf("I'm child after second fork() My pid is %i\n", getpid());
        break;
    default:
        printf("I'm parent after second fork() My pid is %i My child's pid is %i\n", getpid(), pid);
        break;
    }
    printf("PID %i exit\n", getpid());
    exit(0);
}

int main(int argc, char *argv[]) {
    pid_t pid;
    printf("Example started with pid %i\n", getpid());
    printf("Commandline args: ");
    while (--argc &gt; 0) {
        printf("%s ", argv[argc]);
    }
    printf("\n");
    switch (pid = fork()) {
    case -1:
        printf("First fork() ERROR\n");
        if (errno == ENOMEM) {
            printf("Memory is tight\n");
        }
        exit(-1);
    case 0:
        printf("I'm child after first fork() My pid is %i\n", getpid());
        dummy_function(I_CHILD);
    default:
        printf("I'm parent after first fork() My pid is %i My child's pid is %i\n", getpid(), pid);
        dummy_function(I_PARENT);
    }
}</pre>
<p>Сохраняем в файл fork.c компилим с ключами: -O0 - отключение оптимизации и -g - для сохранения кода в исполняемый файл (они нужны для отладчика):</p>
<blockquote><p>$ gcc fork.c -O0 -g</p></blockquote>
<p>запускаем:</p>
<blockquote><p>$ ./a.out 1 2 3 4 5 6 7 8 9 10 11 12 13</p></blockquote>
<p>Получаем что-то вроди этого:</p>
<blockquote><p>Example started with pid 6990<br />
Commandline args: 13 12 11 10 9 8 7 6 5 4 3 2 1<br />
I'm parent after first fork() My pid is 6990 My child's pid is 6991<br />
Parent after first fork() call dummy_function() my pid is 6990<br />
I'm child after first fork() My pid is 6991<br />
Child after first fork() call dummy_function() my pid is 6991<br />
I'm parent after second fork() My pid is 6990 My child's pid is 6992<br />
PID 6990 exit<br />
I'm parent after second fork() My pid is 6991 My child's pid is 6993<br />
PID 6991 exit<br />
user@server-32:~/sandbox/gdb_fork_example$ I'm child after second fork() My pid is 6993<br />
PID 6993 exit<br />
I'm child after second fork() My pid is 6992<br />
PID 6992 exit</p></blockquote>
<p>Все программа работает, но вот незадача если мы запустим её под отладчиком то сможем отлаживать лишь самый первый процесс, в предыдущем примере у него был pid 6990. И так приступим</p>
]]></content:encoded>
			<wfw:commentRss>http://devhead.ru/main/sposoby-otladki-gdbom-ili-dddom-prilozheniya-s-fork/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->