<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="ru-RU" xml:base="http://blog.sjinks.pro/wp-atom.php">
	<title type="text">Ars Longa, Vita Brevis</title>
	<subtitle type="text">Quod scripsi, scripsi</subtitle>

	<updated>2012-05-19T17:55:07Z</updated>

	<link rel="alternate" type="text/html" href="http://blog.sjinks.pro" />
	<id>http://blog.sjinks.pro/feed/atom/</id>
	

			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/sjblog" /><feedburner:info uri="sjblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>44.60000</geo:lat><geo:long>33.53333</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>sjblog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/sjblog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://my.feedlounge.com/external/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://static.feedlounge.com/buttons/subscribe_0.gif">Subscribe with FeedLounge</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="https://intouch.particls.com/download/?mode=2&amp;feed=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="https://intouch.particls.com/resources/buttons/it-button2.gif">Subscribe with Particls</feedburner:feedFlare><feedburner:feedFlare href="http://www.addtoany.com/?linkname=Ars%20Longa%2C%20Vita%20Brevis&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><feedburner:feedFlare href="http://www.fwicki.com/users/default.aspx?addfeed=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.fwicki.com/images/ui/fwicki_clicklet.png">Subscribe with fwicki</feedburner:feedFlare><entry>
		<author>
			<name>Wandering Soul</name>
					</author>
		<title type="html"><![CDATA[Сброс дискового кеша в Linux]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/wFDnSqb6Ehc/" />
		<id>http://blog.sjinks.pro/?p=973</id>
		<updated>2012-05-19T17:55:07Z</updated>
		<published>2012-05-19T17:55:07Z</published>
		<category scheme="http://blog.sjinks.pro" term="Linux" />		<summary type="html"><![CDATA[При проведении различных тестов иногда бывает весьма полезно очистить дисковый кеш. Делается это так: sudo sh -c &#039;sync; echo 3 &#62; /proc/sys/vm/drop_caches&#039; © 2012 Ars Longa, Vita Brevis. Все права защищены. Перепубликация материалов без разрешения автора запрещена. При использовании материалов блога наличие активной не закрытой от индексирования ссылки на источник обязательно.<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/973-flush-disk-cache/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/linux/973-flush-disk-cache/">&lt;p&gt;При проведении различных тестов иногда бывает весьма полезно очистить дисковый кеш.&lt;span id="more-973"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Делается это так:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p9732"&gt;
        &lt;div class="code bash" id="p973code2"&gt;
&lt;span class="kw2"&gt;sudo&lt;/span&gt; &lt;span class="kw2"&gt;sh&lt;/span&gt; &lt;span class="re5"&gt;-c&lt;/span&gt; &lt;span class="st_h"&gt;'sync; echo 3 &amp;gt; /proc/sys/vm/drop_caches'&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/linux/973-flush-disk-cache/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x2x5cStcTI4hJXHwcA1yi7vhHPI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x2x5cStcTI4hJXHwcA1yi7vhHPI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x2x5cStcTI4hJXHwcA1yi7vhHPI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x2x5cStcTI4hJXHwcA1yi7vhHPI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=wFDnSqb6Ehc:2qv-G7qtNEM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=wFDnSqb6Ehc:2qv-G7qtNEM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=wFDnSqb6Ehc:2qv-G7qtNEM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=wFDnSqb6Ehc:2qv-G7qtNEM:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=wFDnSqb6Ehc:2qv-G7qtNEM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/wFDnSqb6Ehc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/linux/973-flush-disk-cache/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/linux/973-flush-disk-cache/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/linux/973-flush-disk-cache/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://blog.sjinks.pro/</uri>
					</author>
		<title type="html"><![CDATA[Доступ к закрытым свойствам класса в PHP]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/Jx924aAVn1Y/" />
		<id>http://blog.sjinks.pro/?p=970</id>
		<updated>2012-05-14T15:06:43Z</updated>
		<published>2012-05-14T15:03:09Z</published>
		<category scheme="http://blog.sjinks.pro" term="PHP" /><category scheme="http://blog.sjinks.pro" term="reflection" /><category scheme="http://blog.sjinks.pro" term="Yii" />		<summary type="html"><![CDATA[Крутили гайку номер шесть ключом на восемнадцать… Иногда встречаются ситуации, когда нужно расширить функциональность класса сторонней библиотеки; при этом нужный класс реализован так, что вместо наследования проще переписать, ибо функциональность завязана на закрытых (private) свойствах класса, для которых он не предоставляет акцессоров. Чтобы далеко не ходить за примером, можно посмотреть на реализацию работы с базой [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/php/970-access-private-class-properties/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/php/970-access-private-class-properties/">&lt;h2&gt;&lt;em&gt;Крутили гайку номер шесть ключом на восемнадцать…&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Иногда встречаются ситуации, когда нужно расширить функциональность класса сторонней библиотеки; при этом нужный класс реализован так, что вместо наследования проще переписать, ибо функциональность завязана на закрытых (private) свойствах класса, для которых он не предоставляет акцессоров.&lt;/p&gt;
&lt;p&gt;Чтобы далеко не ходить за примером, можно посмотреть на реализацию работы с базой данных в &lt;a href="http://blog.sjinks.pro/tag/yii/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Yii"&gt;Yii&lt;/a&gt; — если требуется что-то нестандартное и не предусмотренное разработчиками — придётся извращаться. Например, если нужно добавить поддержку &lt;span class="codebox"&gt;&lt;code class="mysql"&gt;&lt;span class="kw1"&gt;SELECT&lt;/span&gt; … FOR &lt;span class="kw1"&gt;UPDATE&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;/&lt;span class="codebox"&gt;&lt;code class="mysql"&gt;&lt;span class="kw1"&gt;SELECT&lt;/span&gt; … &lt;span class="kw1"&gt;LOCK&lt;/span&gt; &lt;span class="kw2"&gt;IN&lt;/span&gt; &lt;span class="kw1"&gt;SHARE MODE&lt;/span&gt;&lt;/code&gt;&lt;/span&gt; (кстати, весьма нужный довесок для высоконагруженных сайтов с активной работой с базой данных), кажется вполне логичным унаследоваться от класса &lt;code&gt;CDbCommand&lt;/code&gt; и добавить свои методы для организации блокировки и переопределить метод &lt;code&gt;buildQuery&lt;/code&gt;. В теории это выглядит хорошо, но на практике имеем, что вся функциональность завязана на закрытое свойство &lt;code&gt;CDbCommand::_q&lt;/code&gt;, в котором хранятся все параметры запроса. Кроме того, для поддержки этого хозяйства в Active Record придётся унаследоваться от CActiveRecord, а там такая же петрушка.&lt;/p&gt;
&lt;p&gt;&lt;em style="font-size: .8em"&gt;На правах лирического отступления: при всей моей любви к Yii, некоторые архитектурные решения выглядят весьма непродуманными и вызывают во мне любимый жест капитана Пикара: множественные косяки с закрытыми свойствами, проверки &lt;span class="codebox"&gt;&lt;code class="php"&gt;&lt;span class="kw3"&gt;method_exists&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt; идут вразрез с идеологией &lt;code&gt;CComponent&lt;/code&gt; (например, использование mixin (behavior) как метода форматирования в класс, порождённый от &lt;code&gt;CFormatter&lt;/code&gt;, закончится исключением), неудачное разбиение на методы, из-за которого наследование временами превращается в копипаст и т.д.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP"&gt;PHP&lt;/a&gt; — это не C++, поэтому антипаттерн &lt;a href="http://www.javenue.info/post/56"&gt;Паблик Морозов&lt;/a&gt; (&lt;span class="codebox"&gt;&lt;code class="c"&gt;&lt;span class="co2"&gt;#define private public&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;) здесь не пройдёт. К счастью, костылестроение в PHP поставлено на поток, поэтому решение всё же есть…&lt;span id="more-970"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;В PHP есть достаточно мощное &lt;a href="http://php.net/manual/en/book.reflection.php"&gt;Reflection API&lt;/a&gt; (хотя местами плохо документированное), позволяющее разработчику творить чудеса.&lt;/p&gt;
&lt;p&gt;Например, есть у нас такой фрагмент класса:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p9706"&gt;
        &lt;div class="code php" id="p970code6"&gt;
&lt;span class="kw2"&gt;class&lt;/span&gt; CDbCommand &lt;span class="kw2"&gt;extends&lt;/span&gt; CComponent&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="re0"&gt;$_query&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;API этого класса не предоставляет никакого доступа к закрытому свойству &lt;code&gt;$_query&lt;/code&gt;, но, тем не менее, доступ к нему очень нужен, чтобы не переписывать большую часть исходного класса.&lt;/p&gt;
&lt;p&gt;Для начала нужно создать отражение класса: &lt;span class="codebox"&gt;&lt;code class="php"&gt;&lt;span class="re0"&gt;$reflected&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; ReflectionClass&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;
Затем нужно переместиться в класс-предок: &lt;span class="codebox"&gt;&lt;code class="php"&gt;&lt;span class="re0"&gt;$reflected&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$reflected&lt;/span&gt;&lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt;getParentClass&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;
Потом получаем свойство &lt;code&gt;$_query&lt;/code&gt;: &lt;span class="codebox"&gt;&lt;code class="php"&gt;&lt;span class="re0"&gt;$p_query&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$reflected&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;getProperty&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'_query'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;
После чего делаем его доступным для чтения/изменения &lt;strong&gt;через&lt;/strong&gt; &lt;a href="http://blog.sjinks.pro/tag/reflection/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  reflection"&gt;Reflection&lt;/a&gt; API: &lt;span class="codebox"&gt;&lt;code class="php"&gt;&lt;span class="re0"&gt;$p_query&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;setAccessible&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Чтение свойства:&lt;/strong&gt; &lt;span class="codebox"&gt;&lt;code class="php"&gt;&lt;span class="re0"&gt;$p_query&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;getValue&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;Изменение свойства:&lt;/strong&gt; &lt;span class="codebox"&gt;&lt;code class="php"&gt;&lt;span class="re0"&gt;$p_query&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;setValue&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="re0"&gt;$new_value&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Полный пример (с минимальным количеством кода):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p9707"&gt;
        &lt;div class="code php" id="p970code7"&gt;
&lt;span class="kw2"&gt;class&lt;/span&gt; DbCommand &lt;span class="kw2"&gt;extends&lt;/span&gt; CDbCommand&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;const&lt;/span&gt; LOCK_SHARED &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st_h"&gt;'r'&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;const&lt;/span&gt; LOCK_EXCLUSIVE &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st_h"&gt;'w'&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="re0"&gt;$p_query&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; __construct&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;CDbConnection &lt;span class="re0"&gt;$connection&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="re0"&gt;$query&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw4"&gt;null&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;parent&lt;/span&gt;&lt;span class="sy0"&gt;::&lt;/span&gt;__construct&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$connection&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="re0"&gt;$query&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$reflected&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; ReflectionClass&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$reflected&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$reflected&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;getParentClass&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;p_query&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$reflected&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;getProperty&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st_h"&gt;'_query'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;p_query&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;setAccessible&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;function&lt;/span&gt; sharedLock&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$v&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;p_query&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;getValue&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$v&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st_h"&gt;'lock'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;self&lt;/span&gt;&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;LOCK_SHARED&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;p_query&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;setValue&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="re0"&gt;$v&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;При использовании Reflection API в конструкторе для получения информации о родительском классе следует помнить о значении &lt;code&gt;$this&lt;/code&gt;: если у класса нет детей, то &lt;code&gt;$this&lt;/code&gt; будет соответствовать данному классу; если же потомки есть и создаётся именно класс-потомок, то &lt;code&gt;$this&lt;/code&gt; будет соответствовать именно тому потомку.&lt;/p&gt;
&lt;p&gt;Решить это можно так:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p9708"&gt;
        &lt;div class="code php" id="p970code8"&gt;
&lt;span class="re0"&gt;$reflected&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; ReflectionClass&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$this&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="re0"&gt;$me&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; strtlower&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;__CLASS__&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;while&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw3"&gt;strtolower&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$reflected&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;getName&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;!=&lt;/span&gt; &lt;span class="re0"&gt;$me&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="re0"&gt;$reflected&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$reflected&lt;/span&gt;&lt;span class="sy0"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="me1"&gt;getParentClass&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Безусловно, Reflection API в PHP — мощный инструмент, но, как и все подобные инструменты, применять его нужно осторожно и с умом&lt;/p&gt;
&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/php/970-access-private-class-properties/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HUd_isQkEZvkaPRJo6JVT-Rz_O4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HUd_isQkEZvkaPRJo6JVT-Rz_O4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HUd_isQkEZvkaPRJo6JVT-Rz_O4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HUd_isQkEZvkaPRJo6JVT-Rz_O4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Jx924aAVn1Y:G765kZgjgJE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Jx924aAVn1Y:G765kZgjgJE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Jx924aAVn1Y:G765kZgjgJE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Jx924aAVn1Y:G765kZgjgJE:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Jx924aAVn1Y:G765kZgjgJE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/Jx924aAVn1Y" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/php/970-access-private-class-properties/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/php/970-access-private-class-properties/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/php/970-access-private-class-properties/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://blog.sjinks.pro/</uri>
					</author>
		<title type="html"><![CDATA[Отслеживание источника исключения в С++]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/XVwVRJSFYjQ/" />
		<id>http://blog.sjinks.pro/?p=969</id>
		<updated>2012-04-30T02:51:57Z</updated>
		<published>2012-04-30T02:50:20Z</published>
		<category scheme="http://blog.sjinks.pro" term="C/C++" /><category scheme="http://blog.sjinks.pro" term="gcc" /><category scheme="http://blog.sjinks.pro" term="Linux" />		<summary type="html"><![CDATA[Лезем в глубокие дебри C++ и его ABI Обобщённая версия статьи «Отслеживание источника исключения в Qt». Решение проблемы отлова не пойманного исключения при помощи gdb — задача не из приятных, особенно при отладке многопоточных приложений. К счастью, есть и более простой способ. Чтобы понять, как организована работа с исключениями на уровне стандартной библиотеки, нужно тщательно выкурить ABI [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/969-track-uncaught-exceptions/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/c-cpp/969-track-uncaught-exceptions/">&lt;h2&gt;&lt;em&gt;Лезем в глубокие дебри C++ и его ABI&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Обобщённая версия статьи «&lt;a href="http://blog.sjinks.pro/c-cpp/qt/964-exception-source-qt/" title="Отслеживание источника исключения в Qt"&gt;Отслеживание источника исключения в Qt&lt;/a&gt;».&lt;/p&gt;
&lt;p&gt;Решение проблемы отлова не пойманного исключения при помощи gdb — задача не из приятных, особенно при отладке многопоточных приложений. К счастью, есть и более простой способ.&lt;span id="more-969"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Чтобы понять, как организована работа с исключениями на уровне стандартной библиотеки, нужно тщательно выкурить &lt;abbr title="Application Binary Interface"&gt;ABI&lt;/abbr&gt; языка C++, в частности, главу, посвящённую &lt;a href="http://sourcery.mentor.com/public/cxx-abi/abi-eh.html"&gt;обработке исключений&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Из всей главы нам интересны две функции:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span class="codebox"&gt;&lt;code class="cpp"&gt;&lt;span class="kw4"&gt;void&lt;/span&gt; __cxa_throw &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt; &lt;span class="sy2"&gt;*&lt;/span&gt;thrown_exception, std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;type_info&lt;/span&gt; &lt;span class="sy2"&gt;*&lt;/span&gt;tinfo, &lt;span class="kw4"&gt;void&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;dest&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt; &lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="codebox"&gt;&lt;code class="cpp"&gt;&lt;span class="kw4"&gt;void&lt;/span&gt; __cxa_rethrow &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Первая функция кидает исключение (&lt;code&gt;thrown_exception&lt;/code&gt; — кидаемое исключение, &lt;code&gt;tinfo&lt;/code&gt; — указатель на информацию о типе исключения (тип &lt;code&gt;std::type_info&lt;/code&gt; определён в заголовке &lt;code&gt;&amp;lt;typeinfo&amp;gt;&lt;/code&gt;), dest — указатель на деструктор исключения). В принципе, единственное, что нам может быть полезно — это &lt;code&gt;tinfo&lt;/code&gt;: &lt;code&gt;tinfo-&amp;gt;name()&lt;/code&gt; даст нам имя типа исключения.&lt;/p&gt;
&lt;p&gt;Имя исключения будет иметь вид &lt;code&gt;St13runtime_error&lt;/code&gt; (&lt;dfn&gt;mangled name&lt;/dfn&gt;); для декодирования можно использовать &lt;a href="http://sourcery.mentor.com/public/cxx-abi/abi.html#demangler"&gt;функцию&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="codebox"&gt;&lt;code class="cpp"&gt;&lt;span class="kw4"&gt;extern&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__cxa_demangle &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; mangled_name, &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; buf, &lt;span class="kw4"&gt;size_t&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; n, &lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; status&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96915"&gt;
        &lt;div class="code cpp" id="p969code15"&gt;
&lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; demangled &lt;span class="sy1"&gt;=&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt; __cxa_demangle&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tinfo&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;name&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, 0, 0, 0&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;cerr&lt;/span&gt; &lt;span class="sy1"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;Thrown exception of type &amp;quot;&lt;/span&gt; &lt;span class="sy1"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;demangled &lt;span class="sy4"&gt;?&lt;/span&gt; demangled &lt;span class="sy4"&gt;:&lt;/span&gt; tinfo&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;name&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy1"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;endl&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;demangled&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;free&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;demangled&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;При большом желании можно проверить, наследуется ли брошенное исключение от &lt;code&gt;std::exception&lt;/code&gt;; если да, то можно вывести на экран значение &lt;code&gt;exception::what()&lt;/code&gt;. Проблема здесь в том, что &lt;code&gt;thrown_exception&lt;/code&gt; типа &lt;code&gt;void*&lt;/code&gt; — как следствие, &lt;code&gt;dynamic_cast&lt;/code&gt; не сработает. Поэтому для такой магии придётся разбираться, &lt;a href="http://sourcery.mentor.com/public/cxx-abi/abi.html#rtti"&gt;как работает &lt;code&gt;dynamic_cast&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Если вкратце, на помощь приходит функция&lt;/p&gt;
&lt;p&gt;&lt;span class="codebox"&gt;&lt;code class="cpp"&gt;&lt;span class="kw4"&gt;extern&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; __dynamic_cast &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; &lt;span class="sy2"&gt;*&lt;/span&gt;sub, &lt;span class="kw4"&gt;const&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info &lt;span class="sy2"&gt;*&lt;/span&gt;src, &lt;span class="kw4"&gt;const&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info &lt;span class="sy2"&gt;*&lt;/span&gt;dst, std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw4"&gt;ptrdiff_t&lt;/span&gt; src2dst_offset&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Алгоритм тут такой:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Проверить, является ли &lt;code&gt;tinfo&lt;/code&gt; экземпляром класса &lt;code&gt;abi::__class_type_info&lt;/code&gt;; если нет, то брошенное исключение — не объект.&lt;/li&gt;
&lt;li&gt;Привести &lt;code&gt;&amp;#038;typeid(std::exception)&lt;/code&gt; к типу &lt;code&gt;const abi::__class_type_info*&lt;/code&gt; (преобразование просто должно сработать).&lt;/li&gt;
&lt;li&gt;Вызвав &lt;code&gt;__dynamic_cast&lt;/code&gt;, проверить, унаследовано ли &lt;code&gt;thrown_exception&lt;/code&gt; от &lt;code&gt;std::exception&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96916"&gt;
        &lt;div class="code cpp" id="p969code16"&gt;
&lt;span class="kw4"&gt;const&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info&lt;span class="sy2"&gt;*&lt;/span&gt; exc &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;dynamic_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;const&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy3"&gt;&amp;amp;&lt;/span&gt;&lt;span class="kw2"&gt;typeid&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;exception&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;const&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info&lt;span class="sy2"&gt;*&lt;/span&gt; cti &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;dynamic_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tinfo&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;cti &lt;span class="sy3"&gt;&amp;amp;&amp;amp;&lt;/span&gt; exc&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;exception&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; the_exception &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;exception&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;abi&lt;span class="sy4"&gt;::&lt;/span&gt;__dynamic_cast&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;thrown_exception, exc, cti, &lt;span class="sy2"&gt;-&lt;/span&gt;1&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;the_exception&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;cout&lt;/span&gt; &lt;span class="sy1"&gt;&amp;lt;&amp;lt;&lt;/span&gt; the_exception&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;what&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy1"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;endl&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Осталось получить backtrace. Здесь нет &lt;a href="http://linux.die.net/man/3/backtrace"&gt;ничего сложного&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Вторая функция (&lt;code&gt;__cxa_rethrow&lt;/code&gt;) вызывается из catch-блока и кидает обрабатываемое исключение ещё раз. Так как у функции нет аргументов (совсем нет), то бросаемое исключение придётся получать самостоятельно. Для этого используется функция&lt;/p&gt;
&lt;p&gt;&lt;span class="codebox"&gt;&lt;code class="cpp"&gt;&lt;span class="kw4"&gt;extern&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; __cxa_eh_globals &lt;span class="sy2"&gt;*&lt;/span&gt;__cxa_get_globals&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;struct&lt;/span&gt; __cxa_eh_globals &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; __cxa_exception&lt;span class="sy2"&gt;*&lt;/span&gt; caughtExceptions&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;unsigned&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; uncaughtExceptions&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;__cxa_exception&lt;/code&gt; — заголовок исключения; непосредственно за ним следует бросаемый объект.&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96917"&gt;
        &lt;div class="code cpp" id="p969code17"&gt;
__cxa_eh_globals&lt;span class="sy2"&gt;*&lt;/span&gt; g &lt;span class="sy1"&gt;=&lt;/span&gt; __cxa_get_globals&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;g &lt;span class="sy3"&gt;&amp;amp;&amp;amp;&lt;/span&gt; g&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;caughtExceptions&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; thrown_exception &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;uint8_t&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;g&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;caughtExceptions&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy2"&gt;+&lt;/span&gt; &lt;span class="kw3"&gt;sizeof&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;struct&lt;/span&gt; __cxa_exception&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;type_info&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; tinfo &amp;nbsp;&lt;span class="sy1"&gt;=&lt;/span&gt; g&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;caughtExceptions&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;exceptionType&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Далее всё аналогично __cxa_throw&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Всё готово, дело за малым: перехватить вызовы &lt;code&gt;__cxa_throw&lt;/code&gt; и &lt;code&gt;__cxa_rethrow&lt;/code&gt;. Тут всё просто:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96918"&gt;
        &lt;div class="code cpp" id="p969code18"&gt;
&lt;span class="co2"&gt;#include &amp;lt;dlfcn.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;cxa_throw_type&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; , std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;type_info&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;, &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;cxa_rethrow_type&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
cxa_throw_type &amp;nbsp; orig_cxa_throw &amp;nbsp; &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;cxa_throw_type&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dlsym&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;RTLD_NEXT, &lt;span class="st0"&gt;&amp;quot;__cxa_throw&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
cxa_rethrow_type orig_cxa_rethrow &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;cxa_rethrow_type&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dlsym&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;RTLD_NEXT, &lt;span class="st0"&gt;&amp;quot;__cxa_rethrow&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;А теперь всё вместе:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96919"&gt;
        &lt;div class="code cpp" id="p969code19"&gt;
&lt;span class="co2"&gt;#include &amp;lt;typeinfo&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;exception&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;dlfcn.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;cstdio&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;inttypes.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;execinfo.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;cxxabi.h&amp;gt; // Определяет типы из namespace abi&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;cstring&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;stdexcept&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw2"&gt;namespace&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &lt;span class="co1"&gt;// Важно: без анонимного пространства имён gcc начинает клинить&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;typedef&lt;/span&gt; uint64_t uint64&lt;span class="sy4"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;// В документации тип зовётся uint64&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;// Типы/структуры данных из http://sourcery.mentor.com/public/cxx-abi/abi-eh.html&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;enum&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_NO_REASON &lt;span class="sy1"&gt;=&lt;/span&gt; 0,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_FOREIGN_EXCEPTION_CAUGHT &lt;span class="sy1"&gt;=&lt;/span&gt; 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_FATAL_PHASE2_ERROR &lt;span class="sy1"&gt;=&lt;/span&gt; 2,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_FATAL_PHASE1_ERROR &lt;span class="sy1"&gt;=&lt;/span&gt; 3,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_NORMAL_STOP &lt;span class="sy1"&gt;=&lt;/span&gt; 4,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_END_OF_STACK &lt;span class="sy1"&gt;=&lt;/span&gt; 5,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_HANDLER_FOUND &lt;span class="sy1"&gt;=&lt;/span&gt; 6,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_INSTALL_CONTEXT &lt;span class="sy1"&gt;=&lt;/span&gt; 7,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _URC_CONTINUE_UNWIND &lt;span class="sy1"&gt;=&lt;/span&gt; 8&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; _Unwind_Reason_Code&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;_Unwind_Exception_Cleanup_Fn&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_Unwind_Reason_Code reason, &lt;span class="kw4"&gt;struct&lt;/span&gt; _Unwind_Exception&lt;span class="sy2"&gt;*&lt;/span&gt; exc&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;struct&lt;/span&gt; _Unwind_Exception &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; uint64 exception_class&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _Unwind_Exception_Cleanup_Fn exception_cleanup&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; uint64 private_1&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; uint64 private_2&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;struct&lt;/span&gt; __cxa_exception &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;type_info&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; exceptionType&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;void&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;exceptionDestructor&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;unexpected_handler&lt;/span&gt; unexpectedHandler&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;terminate_handler&lt;/span&gt; terminateHandler&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; __cxa_exception&lt;span class="sy2"&gt;*&lt;/span&gt; nextException&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; handlerCount&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; handlerSwitchValue&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; actionRecord&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; languageSpecificData&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; catchTemp&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; adjustedPtr&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; _Unwind_Exception unwindHeader&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;struct&lt;/span&gt; __cxa_eh_globals &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; __cxa_exception&lt;span class="sy2"&gt;*&lt;/span&gt; caughtExceptions&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;unsigned&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; uncaughtExceptions&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;extern&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; __cxa_eh_globals&lt;span class="sy2"&gt;*&lt;/span&gt; __cxa_get_globals&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;// Тип функции __cxa_throw&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;cxa_throw_type&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;, std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;type_info&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;, &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;// Тип функции __cxa_rethrow&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;cxa_rethrow_type&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;static&lt;/span&gt; cxa_throw_type &amp;nbsp; orig_cxa_throw &amp;nbsp; &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;// Адрес оригинальной функции __cxa_throw&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;static&lt;/span&gt; cxa_rethrow_type orig_cxa_rethrow &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;// Адрес оригинальной функции __cxa_rethrow&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;static&lt;/span&gt; pthread_mutex_t guard &lt;span class="sy1"&gt;=&lt;/span&gt; PTHREAD_MUTEX_INITIALIZER&lt;span class="sy4"&gt;;&lt;/span&gt; &lt;span class="co1"&gt;// Мьютекс на всякий пожарный&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;// Получение трассы вызовов&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;// Здесь и далее сознательно используются функции из стандартной библиотеки C, так как они не генерируют исключений&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;// Исключение в низкоуровневом обработчике исключения - это что-то&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; get_backtrace&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; buf&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;128&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; n &lt;span class="sy1"&gt;=&lt;/span&gt; backtrace&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;buf, 128&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;fprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;stderr&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;%s&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;*** BACKTRACE ***&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; backtrace_symbols_fd&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;buf, n, STDERR_FILENO&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;// Код, приведённый далее, предполагает наличие программ readlink и addr2line&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;// идея состоит в скармливании адресов, полученных backtrace(3), addr2line(1)&lt;/span&gt;&lt;br /&gt;
&lt;span class="co1"&gt;// с целью получения понятного человеку результата&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw4"&gt;size_t&lt;/span&gt; bufsize &lt;span class="sy1"&gt;=&lt;/span&gt; 19&lt;span class="sy2"&gt;*&lt;/span&gt;n &lt;span class="sy2"&gt;+&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;strlen&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;/usr/bin/addr2line -pifCa -e `/bin/readlink /proc/XXXXX/exe` 1&amp;gt;&amp;amp;2&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy2"&gt;+&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; space &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;calloc&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;bufsize, 1&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;space&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; orig &lt;span class="sy1"&gt;=&lt;/span&gt; space&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; c &lt;span class="sy1"&gt;=&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;sprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;space, &lt;span class="st0"&gt;&amp;quot;/usr/bin/addr2line -pifCa -e `/bin/readlink /proc/%d/exe` &amp;quot;&lt;/span&gt;, getpid&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; space &lt;span class="sy2"&gt;+&lt;/span&gt;&lt;span class="sy1"&gt;=&lt;/span&gt; c&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt; i&lt;span class="sy1"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt; i&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;n&lt;span class="sy4"&gt;;&lt;/span&gt; &lt;span class="sy2"&gt;++&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c &lt;span class="sy1"&gt;=&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;sprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;space, &lt;span class="st0"&gt;&amp;quot;%p &amp;quot;&lt;/span&gt;, buf&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; space &lt;span class="sy2"&gt;+&lt;/span&gt;&lt;span class="sy1"&gt;=&lt;/span&gt; c&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;fprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;stderr&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;%s&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;&lt;span class="es1"&gt;\n&lt;/span&gt;*** DECODED BACKTRACE ***&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;sprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;space, &lt;span class="st0"&gt;&amp;quot;%s&amp;quot;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;1&amp;gt;&amp;amp;2&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;fprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;stderr&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;%s&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, orig&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;system&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;orig&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; &lt;span class="co1"&gt;// Чтобы не ругался gcc&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;free&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;orig&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;// Обработка исключения, общая для __cxz_throw и __cxa_rethrow&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; handle_exception&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; thrown_exception, std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;type_info&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; tinfo, &lt;span class="kw4"&gt;bool&lt;/span&gt; rethrown&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; demangled &lt;span class="sy1"&gt;=&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt; __cxa_demangle&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tinfo&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;name&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, 0, 0, 0&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;fprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;stderr&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;%s exception of type %s&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;rethrown &lt;span class="sy4"&gt;?&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;Rethrown&amp;quot;&lt;/span&gt; &lt;span class="sy4"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;Thrown&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;demangled &lt;span class="sy4"&gt;?&lt;/span&gt; demangled &lt;span class="sy4"&gt;:&lt;/span&gt; tinfo&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;name&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;demangled&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;free&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;demangled&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;const&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info&lt;span class="sy2"&gt;*&lt;/span&gt; exc &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;dynamic_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;const&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy3"&gt;&amp;amp;&lt;/span&gt;&lt;span class="kw2"&gt;typeid&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;exception&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;const&lt;/span&gt; abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info&lt;span class="sy2"&gt;*&lt;/span&gt; cti &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;dynamic_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;abi&lt;span class="sy4"&gt;::&lt;/span&gt;__class_type_info&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tinfo&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;cti &lt;span class="sy3"&gt;&amp;amp;&amp;amp;&lt;/span&gt; exc&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;exception&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; the_exception &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;exception&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;abi&lt;span class="sy4"&gt;::&lt;/span&gt;__dynamic_cast&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;thrown_exception, exc, cti, &lt;span class="sy2"&gt;-&lt;/span&gt;1&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;the_exception&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;fprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;stderr&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;what(): %s&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, the_exception&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;what&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_backtrace&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;fprintf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;stderr&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;&lt;span class="es1"&gt;\n&lt;/span&gt;&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;extern&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; __cxa_throw&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; thrown_exception, std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;type_info&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; tinfo, &lt;span class="kw4"&gt;void&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;dest&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; pthread_mutex_lock&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy3"&gt;&amp;amp;&lt;/span&gt;guard&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; handle_exception&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;thrown_exception, tinfo, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; pthread_mutex_unlock&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy3"&gt;&amp;amp;&lt;/span&gt;guard&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;orig_cxa_throw&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; orig_cxa_throw&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;thrown_exception, tinfo, dest&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;terminate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;extern&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;C&amp;quot;&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; __cxa_rethrow&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; pthread_mutex_lock&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy3"&gt;&amp;amp;&lt;/span&gt;guard&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; __cxa_eh_globals&lt;span class="sy2"&gt;*&lt;/span&gt; g &lt;span class="sy1"&gt;=&lt;/span&gt; __cxa_get_globals&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;g &lt;span class="sy3"&gt;&amp;amp;&amp;amp;&lt;/span&gt; g&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;caughtExceptions&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="sy2"&gt;*&lt;/span&gt; thrown_exception &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;uint8_t&lt;span class="sy2"&gt;*&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;g&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;caughtExceptions&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy2"&gt;+&lt;/span&gt; &lt;span class="kw3"&gt;sizeof&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;struct&lt;/span&gt; __cxa_exception&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handle_exception&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;thrown_exception, g&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;caughtExceptions&lt;span class="sy2"&gt;-&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;exceptionType, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; pthread_mutex_unlock&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy3"&gt;&amp;amp;&lt;/span&gt;guard&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;orig_cxa_rethrow&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; orig_cxa_rethrow&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;terminate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;// Инициализация переменных. Можно сделать это и в обработчике, но так безопаснее&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; initialize&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; orig_cxa_throw &amp;nbsp; &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;cxa_throw_type&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dlsym&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;RTLD_NEXT, &lt;span class="st0"&gt;&amp;quot;__cxa_throw&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; orig_cxa_rethrow &lt;span class="sy1"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;cxa_rethrow_type&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dlsym&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;RTLD_NEXT, &lt;span class="st0"&gt;&amp;quot;__cxa_rethrow&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;int&lt;/span&gt; main&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;**&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; initialize&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;throw&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;runtime_error&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;123&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;catch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;const&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;exception&lt;/span&gt;&lt;span class="sy3"&gt;&amp;amp;&lt;/span&gt; e&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;printf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;e.what(): %s&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, e.&lt;span class="me1"&gt;what&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;throw&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;catch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;const&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;exception&lt;/span&gt;&lt;span class="sy3"&gt;&amp;amp;&lt;/span&gt; d&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;printf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;d.what(): %s&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, d.&lt;span class="me1"&gt;what&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;throw&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;catch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt; x&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="kw3"&gt;printf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;%d&lt;span class="es1"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;, x&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Пример работы (у меня в оригинале кода нет комментариев, так что номера строк будут отличаться):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96920"&gt;
        &lt;div class="code text" id="p969code20"&gt;
$ g++ test.cpp -O2 -g -o test -ldl&lt;br /&gt;
$ ./test&lt;br /&gt;
Thrown exception of type std::runtime_error&lt;br /&gt;
what(): 123&lt;br /&gt;
*** BACKTRACE ***&lt;br /&gt;
./test[0x401127]&lt;br /&gt;
./test(__cxa_throw+0x33)[0x401303]&lt;br /&gt;
./test[0x40141f]&lt;br /&gt;
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f3c05c2576d]&lt;br /&gt;
./test[0x400fa9]&lt;br /&gt;
&lt;br /&gt;
*** DECODED BACKTRACE ***&lt;br /&gt;
/usr/bin/addr2line -pifCa -e `/bin/readlink /proc/4387/exe` 0x401127 0x401303 0x40141f 0x7f3c05c2576d 0x400fa9 1&amp;gt;&amp;amp;2&lt;br /&gt;
0x0000000000401127: fprintf at /usr/include/x86_64-linux-gnu/bits/stdio2.h:99&lt;br /&gt;
&amp;nbsp;(inlined by) get_backtrace at /home/vladimir/test/test.cpp:73&lt;br /&gt;
&amp;nbsp;(inlined by) handle_exception at /home/vladimir/test/test.cpp:114&lt;br /&gt;
0x0000000000401303: __cxa_throw at /home/vladimir/test/test.cpp:122&lt;br /&gt;
0x000000000040141f: main at /home/vladimir/test/test.cpp:167&lt;br /&gt;
0x00007f3c05c2576d: ??&lt;br /&gt;
??:0&lt;br /&gt;
0x0000000000400fa9: _start at ??:0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
e.what(): 123&lt;br /&gt;
Rethrown exception of type std::runtime_error&lt;br /&gt;
what(): 123&lt;br /&gt;
*** BACKTRACE ***&lt;br /&gt;
./test[0x401127]&lt;br /&gt;
./test(__cxa_rethrow+0x31)[0x401371]&lt;br /&gt;
./test[0x4014de]&lt;br /&gt;
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f3c05c2576d]&lt;br /&gt;
./test[0x400fa9]&lt;br /&gt;
&lt;br /&gt;
*** DECODED BACKTRACE ***&lt;br /&gt;
/usr/bin/addr2line -pifCa -e `/bin/readlink /proc/4387/exe` 0x401127 0x401371 0x4014de 0x7f3c05c2576d 0x400fa9 1&amp;gt;&amp;amp;2&lt;br /&gt;
0x0000000000401127: fprintf at /usr/include/x86_64-linux-gnu/bits/stdio2.h:99&lt;br /&gt;
&amp;nbsp;(inlined by) get_backtrace at /home/vladimir/test/test.cpp:73&lt;br /&gt;
&amp;nbsp;(inlined by) handle_exception at /home/vladimir/test/test.cpp:114&lt;br /&gt;
0x0000000000401371: __cxa_rethrow at /home/vladimir/test/test.cpp:141&lt;br /&gt;
0x00000000004014de: main at /home/vladimir/test/test.cpp:179&lt;br /&gt;
0x00007f3c05c2576d: ??&lt;br /&gt;
??:0&lt;br /&gt;
0x0000000000400fa9: _start at ??:0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
d.what(): 123&lt;br /&gt;
Thrown exception of type int&lt;br /&gt;
*** BACKTRACE ***&lt;br /&gt;
./test[0x401127]&lt;br /&gt;
./test(__cxa_throw+0x33)[0x401303]&lt;br /&gt;
./test[0x4014b7]&lt;br /&gt;
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f3c05c2576d]&lt;br /&gt;
./test[0x400fa9]&lt;br /&gt;
&lt;br /&gt;
*** DECODED BACKTRACE ***&lt;br /&gt;
/usr/bin/addr2line -pifCa -e `/bin/readlink /proc/4387/exe` 0x401127 0x401303 0x4014b7 0x7f3c05c2576d 0x400fa9 1&amp;gt;&amp;amp;2&lt;br /&gt;
0x0000000000401127: fprintf at /usr/include/x86_64-linux-gnu/bits/stdio2.h:99&lt;br /&gt;
&amp;nbsp;(inlined by) get_backtrace at /home/vladimir/test/test.cpp:73&lt;br /&gt;
&amp;nbsp;(inlined by) handle_exception at /home/vladimir/test/test.cpp:114&lt;br /&gt;
0x0000000000401303: __cxa_throw at /home/vladimir/test/test.cpp:122&lt;br /&gt;
0x00000000004014b7: main at /home/vladimir/test/test.cpp:167&lt;br /&gt;
0x00007f3c05c2576d: ??&lt;br /&gt;
??:0&lt;br /&gt;
0x0000000000400fa9: _start at ??:0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Для proof of concept очень даже неплохо.&lt;/p&gt;
&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/c-cpp/969-track-uncaught-exceptions/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4XJNUEmoyOj9xOoGpGLa3PpSgSo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4XJNUEmoyOj9xOoGpGLa3PpSgSo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4XJNUEmoyOj9xOoGpGLa3PpSgSo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4XJNUEmoyOj9xOoGpGLa3PpSgSo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=XVwVRJSFYjQ:B2H6rqIH-Jk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=XVwVRJSFYjQ:B2H6rqIH-Jk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=XVwVRJSFYjQ:B2H6rqIH-Jk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=XVwVRJSFYjQ:B2H6rqIH-Jk:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=XVwVRJSFYjQ:B2H6rqIH-Jk:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/XVwVRJSFYjQ" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/c-cpp/969-track-uncaught-exceptions/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/c-cpp/969-track-uncaught-exceptions/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/c-cpp/969-track-uncaught-exceptions/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Wandering Soul</name>
					</author>
		<title type="html"><![CDATA[Совмещение различных конфигураций сборок при использовании qmake]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/vHqVasRMFtM/" />
		<id>http://blog.sjinks.pro/?p=967</id>
		<updated>2012-04-28T23:45:14Z</updated>
		<published>2012-04-28T23:45:14Z</published>
		<category scheme="http://blog.sjinks.pro" term="Qt" /><category scheme="http://blog.sjinks.pro" term="qmake" /><category scheme="http://blog.sjinks.pro" term="ошибка" />		<summary type="html"><![CDATA[Недокументированные костыли qmake В продолжение темы одновременной сборки взаимно несовместимых конфигураций. В предыдущей записи было показано, что qmake позволяет собирать одновременно взаимно несовместимые конфигурации, как-то: отладочная и релиз-версия приложения, статическая и динамическая версия библиотеки. Тем не менее, без лишних телодвижений совместить несколько конфигураций сборок (например, отладочная и релиз-версия статической и динамической библиотеки) проблематично. В частности, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/qt/967-qmake-combine-different-build-types/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/c-cpp/qt/967-qmake-combine-different-build-types/">&lt;h2&gt;&lt;em&gt;Недокументированные костыли &lt;a href="http://blog.sjinks.pro/tag/qmake/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  qmake"&gt;qmake&lt;/a&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;В продолжение темы &lt;a href="http://blog.sjinks.pro/c-cpp/qt/966-qmake-static-shared-library/" title="Одновременная сборка статической и динамической библиотеки с qmake"&gt;одновременной сборки взаимно несовместимых конфигураций&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;В предыдущей записи было показано, что qmake позволяет собирать одновременно взаимно несовместимые конфигурации, как-то: отладочная и релиз-версия приложения, статическая и динамическая версия библиотеки.&lt;/p&gt;
&lt;p&gt;Тем не менее, без лишних телодвижений совместить несколько конфигураций сборок (например, отладочная и релиз-версия статической и динамической библиотеки) проблематично.&lt;span id="more-967"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;В частности, если задать такую конфигурацию:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96724"&gt;
        &lt;div class="code qmake" id="p967code24"&gt;
CONFIG += static_and_shared debug_and_release build_all
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;qmake сгенерирует только каталоги &lt;code&gt;debug&lt;/code&gt; и &lt;code&gt;release&lt;/code&gt;, хотя и создаст все пять &lt;code&gt;Makefile&lt;/code&gt;:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96725"&gt;
        &lt;div class="code bash" id="p967code25"&gt;
$ &lt;span class="kw2"&gt;ls&lt;/span&gt; &lt;span class="re5"&gt;-1&lt;/span&gt;&lt;br /&gt;
debug&lt;br /&gt;
Makefile&lt;br /&gt;
Makefile.SharedDebug&lt;br /&gt;
Makefile.SharedRelease&lt;br /&gt;
Makefile.StaticDebug&lt;br /&gt;
Makefile.StaticRelease&lt;br /&gt;
release
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Выполнив make, видим, что с таким подходом результат может быть весьма непредсказуемым: в моём случае сначала собиралась цель &lt;code&gt;shared-release&lt;/code&gt;, затем &lt;code&gt;shared-debug&lt;/code&gt;, затем из объектных файлов, собранных для цели &lt;code&gt;shared-release&lt;/code&gt;, собиралась статическая библиотека для цели &lt;code&gt;static-release&lt;/code&gt;; аналогично со &lt;code&gt;static-debug&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Плохо это по крайней мере по двум причинам:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ломается параллельная сборка: при сборке библиотеки может случиться ситуация, когда смешиваются по-разному скомпилированные объектные файлы (например, с и без &lt;abbr title="Position Independent Code"&gt;PIC&lt;/abbr&gt;); в лучшем случае получим предупреждение от компоновщика (что-нибудь загадочное вида &lt;code&gt;error: /tmp/ccdxxjfh.ltrans1.ltrans.o: requires dynamic R_X86_64_PC32 reloc against 'vtable for ClassName' which may overflow at runtime; recompile with -fPIC&lt;/code&gt;), в худшем — столкнёмся с весьма интересными ошибками&lt;/li&gt;
&lt;li&gt;Однозадачная сборка зависит от порядка сборки целей: например, если собирать сначала статическую цель, затем — динамическую, и если при этом статическая библиотека явно не экспортирует функции (например, собирается с &lt;code&gt;-fvisibility=hidden&lt;/code&gt;), то динамическая цель, собранная из файлов для статической цели, может оказаться неработоспособной.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Причина, по которой это происходит, лежит в недрах qmake: всё дело в том, что сборка несовместимых конфигураций является неким костылём. Костыльность эта заключается именно в обработке целей:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;начальная конфигурация:&lt;/strong&gt; &lt;code&gt;static_and_shared debug_and_release build_all&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;изначально имеем пустую переменную &lt;code&gt;OBJECTS_DIR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;qmake начинает с релизной сборки из &lt;code&gt;debug_and_release&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;обработка первой цели (&lt;code&gt;Release&lt;/code&gt;) поместит в &lt;code&gt;OBJECTS_DIR&lt;/code&gt; значение &lt;code&gt;release&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;qmake обрабатывает «вложенную» сборку: &lt;code&gt;shared&lt;/code&gt; из &lt;code&gt;static_and_shared&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;костыль:&lt;/strong&gt; qmake предполагает, что предыдущей сборки либо не было (&lt;code&gt;OBJECTS_DIR&lt;/code&gt; и компания пусты — в этом случае каталог для временных файлов будет совпадать с именем сборки, в нашем случае это &lt;code&gt;shared&lt;/code&gt;), либо конфигурация предыдущей сборки была «антиподом» текущей (то есть &lt;code&gt;static&lt;/code&gt; в данном случае) — тогда в &lt;code&gt;OBJECTS_DIR&lt;/code&gt; и сопуствующих переменных &lt;code&gt;static&lt;/code&gt; заменяется на &lt;code&gt;shared&lt;/code&gt;. Но проблема тут в том, что предыдущая конфигурация была &lt;code&gt;release&lt;/code&gt;, а не &lt;code&gt;static&lt;/code&gt;; как следствие, замена не получится, каталогом для временных файлов останется &lt;code&gt;release&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;затем обрабатывается конфигурация &lt;code&gt;debug&lt;/code&gt;; в &lt;code&gt;OBJECTS_DIR&lt;/code&gt; &lt;code&gt;release&lt;/code&gt; успешно заменяется на &lt;code&gt;debug&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;затем обрабатывается подконфигурация shared; &lt;code&gt;OBJECTS_DIR&lt;/code&gt; остаётся без изменений&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;краткий итог:&lt;/strong&gt; конфигурация &lt;code&gt;release/shared&lt;/code&gt; собрана в &lt;code&gt;release&lt;/code&gt;, &lt;code&gt;debug/shared&lt;/code&gt; — в &lt;code&gt;debug&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;затем обрабатывается конфигурация &lt;code&gt;static&lt;/code&gt;; &lt;code&gt;OBJECTS_DIR&lt;/code&gt; опять остаётся без изменений (&lt;code&gt;debug&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;обрабатывается подконфигурация &lt;code&gt;release&lt;/code&gt;; в &lt;code&gt;OBJECTS_DIR&lt;/code&gt; &lt;code&gt;debug&lt;/code&gt; успешно заменяется на &lt;code&gt;release&lt;/code&gt;; в результате &lt;code&gt;static/release&lt;/code&gt; будет собираться в &lt;code&gt;release&lt;/code&gt;, где собиралась конфигурация &lt;code&gt;release/shared&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;совершенно аналогично &lt;code&gt;static/debug&lt;/code&gt; будет собираться в &lt;code&gt;debug&lt;/code&gt;, где собиралась конфигурация &lt;code&gt;debug/shared&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Временные файлы (в зависимости от их типа) помещаются в каталоги, указанные переменными &lt;code&gt;OBJECTS_DIR&lt;/code&gt;, &lt;code&gt;MOC_DIR&lt;/code&gt; и &lt;code&gt;RCC_DIR&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Для того, чтобы сборка прошла успешно, нужно устанавливать их значения самостоятельно.&lt;/p&gt;
&lt;p&gt;У меня получилось так:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96726"&gt;
        &lt;div class="code qmake" id="p967code26"&gt;
CONFIG += static_and_shared debug_and_release build_all&lt;br /&gt;
&lt;br /&gt;
debug: TARGET = $$join(TARGET,,,_debug)&lt;br /&gt;
&lt;br /&gt;
StaticDebug: &amp;nbsp; OBJECTS_DIR = StaticDebug&lt;br /&gt;
SharedDebug: &amp;nbsp; OBJECTS_DIR = SharedDebug&lt;br /&gt;
StaticRelease: OBJECTS_DIR = StaticRelease&lt;br /&gt;
SharedRelease: OBJECTS_DIR = SharedRelease&lt;br /&gt;
&lt;br /&gt;
MOC_DIR = $$OBJECTS_DIR&lt;br /&gt;
RCC_DIR = $$OBJECTS_DIR
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если отладочная и релизная версия должны размещаться в разных каталогах, нужно также изменять переменную &lt;code&gt;DESTDIR&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;В общем, happy hackin&amp;#8217;!&lt;/p&gt;
&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/c-cpp/qt/967-qmake-combine-different-build-types/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d_2k1KBalDiEWSLy42olNQgw4tw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d_2k1KBalDiEWSLy42olNQgw4tw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d_2k1KBalDiEWSLy42olNQgw4tw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d_2k1KBalDiEWSLy42olNQgw4tw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=vHqVasRMFtM:P0_gsgJJqhs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=vHqVasRMFtM:P0_gsgJJqhs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=vHqVasRMFtM:P0_gsgJJqhs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=vHqVasRMFtM:P0_gsgJJqhs:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=vHqVasRMFtM:P0_gsgJJqhs:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/vHqVasRMFtM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/c-cpp/qt/967-qmake-combine-different-build-types/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/c-cpp/qt/967-qmake-combine-different-build-types/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/c-cpp/qt/967-qmake-combine-different-build-types/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Wandering Soul</name>
					</author>
		<title type="html"><![CDATA[Одновременная сборка статической и динамической библиотеки с qmake]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/WU_9CLb-fJs/" />
		<id>http://blog.sjinks.pro/?p=966</id>
		<updated>2012-04-28T21:47:44Z</updated>
		<published>2012-04-22T12:46:07Z</published>
		<category scheme="http://blog.sjinks.pro" term="Qt" /><category scheme="http://blog.sjinks.pro" term="qmake" />		<summary type="html"><![CDATA[Недокументированные возможности qmake Задача: заставить qmake генерировать статическую и динамическую библиотеку при использовании шаблона сборки lib. Решение: хотя считается, что без костылей такая возможность не реализуется, на самом деле это не так: поддержка одновременной сборки статической и динамической версии библиотеки присутствует по крайней мере со времён Qt 4.5. Всё дело в волшебных prf-файлах. Цитируя официальную [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/qt/966-qmake-static-shared-library/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/c-cpp/qt/966-qmake-static-shared-library/">&lt;h2&gt;&lt;em&gt;Недокументированные возможности &lt;a href="http://blog.sjinks.pro/tag/qmake/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  qmake"&gt;qmake&lt;/a&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Задача:&lt;/strong&gt; заставить qmake генерировать статическую и динамическую библиотеку при использовании шаблона сборки &lt;code&gt;lib&lt;/code&gt;.&lt;span id="more-966"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Решение: хотя считается, что без костылей такая возможность не реализуется, на самом деле это не так: поддержка одновременной сборки статической и динамической версии библиотеки присутствует по крайней мере со времён &lt;a href="http://blog.sjinks.pro/tag/qt/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Qt"&gt;Qt&lt;/a&gt; 4.5.&lt;/p&gt;
&lt;p&gt;Всё дело в волшебных prf-файлах. Цитируя официальную документацию,&lt;/p&gt;
&lt;blockquote&gt;qmake lets you create your own features that can be included in project files by adding their names to the list of values specified by the CONFIG variable. Features are collections of custom functions and definitions in .prf files that can reside in one of many standard directories.&lt;/blockquote&gt;
&lt;p&gt;Если посмотреть каталог &lt;code&gt;mkspec/features&lt;/code&gt; в Qt (например, в Ubuntu/Debian это &lt;code&gt;/usr/share/qt4/mkspecs/features/&lt;/code&gt;), можно увидеть файл &lt;code&gt;static_and_shared.prf&lt;/code&gt;, отвечающий за одновременную сборку статической и динамической версии библиотек.&lt;/p&gt;
&lt;p&gt;Использовать это можно так:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96629"&gt;
        &lt;div class="code gmake" id="p966code29"&gt;
TEMPLATE &amp;nbsp;= lib&lt;br /&gt;
CONFIG &amp;nbsp; += static_and_shared create_prl build_all
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;TEMPLATE = lib&lt;/code&gt; задаёт шаблон сборки (библиотека), &lt;code&gt;static_and_shared&lt;/code&gt; задаёт режим сборки, &lt;code&gt;create_prl&lt;/code&gt; (используется при сборке статической библиотеки) включает режим отслеживания зависимостей библиотеки, &lt;code&gt;build_all&lt;/code&gt; указывает, что собирать нужно обе версии.&lt;/p&gt;
&lt;p&gt;Из параметров &lt;code&gt;CONFIG&lt;/code&gt; недокументированным является только &lt;code&gt;static_and_shared&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Задать различные опции для статической и динамической сборки можно через функцию &lt;code&gt;CONFIG&lt;/code&gt;:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96630"&gt;
        &lt;div class="code qmake" id="p966code30"&gt;
build_pass: CONFIG(static, static|shared) {&lt;br /&gt;
# Опции для статической библиотеки&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
build_pass: CONFIG(shared, static|shared) {&lt;br /&gt;
# Опции для динамической библиотеки&lt;br /&gt;
}
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;На закуску еще две полезных опции для использования в &lt;code&gt;CONFIG&lt;/code&gt; для &lt;a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux"&gt;Linux&lt;/a&gt;/UNIX:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;hide_symbols&lt;/code&gt;: установка видимости символов по умолчанию в hidden. Для чего нужно, читаем &lt;a href="http://gcc.gnu.org/wiki/Visibility"&gt;здесь&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bsymbolic_functions&lt;/code&gt;: привязка ссылок на глобальные функции к определениям этих функций в самой библиотеке (что не позволит привязывать ссылки из библиотеки на свои функции к функциям, экспортируемым из другой библиотеки)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/c-cpp/qt/966-qmake-static-shared-library/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pFzxnS1EIoh8dCqexoF6hKetxc8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pFzxnS1EIoh8dCqexoF6hKetxc8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pFzxnS1EIoh8dCqexoF6hKetxc8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pFzxnS1EIoh8dCqexoF6hKetxc8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=WU_9CLb-fJs:H8NT-Mf54nU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=WU_9CLb-fJs:H8NT-Mf54nU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=WU_9CLb-fJs:H8NT-Mf54nU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=WU_9CLb-fJs:H8NT-Mf54nU:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=WU_9CLb-fJs:H8NT-Mf54nU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/WU_9CLb-fJs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/c-cpp/qt/966-qmake-static-shared-library/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/c-cpp/qt/966-qmake-static-shared-library/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/c-cpp/qt/966-qmake-static-shared-library/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Wandering Soul</name>
					</author>
		<title type="html"><![CDATA[Отслеживание источника исключения в Qt]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/oMG-yPeJAo4/" />
		<id>http://blog.sjinks.pro/?p=964</id>
		<updated>2012-04-13T21:05:31Z</updated>
		<published>2012-04-13T21:05:31Z</published>
		<category scheme="http://blog.sjinks.pro" term="Qt" /><category scheme="http://blog.sjinks.pro" term="C/C++" /><category scheme="http://blog.sjinks.pro" term="gcc" />		<summary type="html"><![CDATA[Получение трассы вызовов к источнику исключений в Qt Если приложение (или сама библиотека Qt) бросает исключение, которое не обрабатывается приложением, исключение попадает в цикл обработки событий Qt (известный как event loop), который выводит сообщение наподобие: Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is not supported in [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/qt/964-exception-source-qt/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/c-cpp/qt/964-exception-source-qt/">&lt;h2&gt;&lt;em&gt;Получение трассы вызовов к источнику исключений в &lt;a href="http://blog.sjinks.pro/tag/qt/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Qt"&gt;Qt&lt;/a&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Если приложение (или сама библиотека Qt) бросает исключение, которое не обрабатывается приложением, исключение попадает в цикл обработки событий Qt (известный как event loop), который выводит сообщение наподобие:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qt has caught an exception thrown from an event handler. Throwing&lt;br /&gt;
exceptions from an event handler is not supported in Qt. You must&lt;br /&gt;
reimplement QApplication::notify() and catch all exceptions there.&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;При использовании &lt;code&gt;libstdc++&lt;/code&gt; может быть выдана дополнительная диагностика:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;terminate called after throwing an instance of &amp;#8216;std::bad_alloc&amp;#8217;&lt;br /&gt;
what(): std::bad_alloc&lt;/strong&gt;&lt;br /&gt;
&lt;span id="more-964"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Получение стека вызовов из обработчика не пойманных исключений (&lt;code&gt;std::set_terminate&lt;/code&gt;) здесь не поможет: трасса приведёт к тому месту, откуда исключение было брошено повторно — то есть в цикл обработки событий Qt.&lt;/p&gt;
&lt;p&gt;В случае использования &lt;a href="http://blog.sjinks.pro/tag/gcc/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  gcc"&gt;gcc&lt;/a&gt; проблему можно решить, поставив в отладчике точку прерывания на функцию &lt;code&gt;__cxa_throw&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Например, в случае с gdb:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96432"&gt;
        &lt;div class="code text" id="p964code32"&gt;
$ gdb buggy_app &lt;br /&gt;
GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02&lt;br /&gt;
Copyright (C) 2012 Free Software Foundation, Inc.&lt;br /&gt;
License GPLv3+: GNU GPL version 3 or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&lt;br /&gt;
This is free software: you are free to change and redistribute it.&lt;br /&gt;
There is NO WARRANTY, to the extent permitted by law. &amp;nbsp;Type &amp;quot;show copying&amp;quot;&lt;br /&gt;
and &amp;quot;show warranty&amp;quot; for details.&lt;br /&gt;
This GDB was configured as &amp;quot;x86_64-linux-gnu&amp;quot;.&lt;br /&gt;
For bug reporting instructions, please see:&lt;br /&gt;
&amp;lt;http://bugs.launchpad.net/gdb-linaro/&amp;gt;...&lt;br /&gt;
Reading symbols from /path/to/buggy_app...done.&lt;br /&gt;
(gdb) start&lt;br /&gt;
Temporary breakpoint 1 at 0x405f6d: file main.cpp, line 75.&lt;br /&gt;
Starting program: /path/to/buggy_app&lt;br /&gt;
[Thread debugging using libthread_db enabled]&lt;br /&gt;
Using host libthread_db library &amp;quot;/lib/x86_64-linux-gnu/libthread_db.so.1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Temporary breakpoint 1, main (argc=3, argv=0x7fffffffe008) at main.cpp:75&lt;br /&gt;
75 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QCoreApplication a(argc, argv);&lt;br /&gt;
(gdb) b __cxa_throw&lt;br /&gt;
Breakpoint 2 at 0x7ffff7154910&lt;br /&gt;
(gdb) c&lt;br /&gt;
Continuing.&lt;br /&gt;
&lt;br /&gt;
Breakpoint 2, 0x00007ffff7154910 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6&lt;br /&gt;
(gdb) bt&lt;br /&gt;
#0 &amp;nbsp;0x00007ffff7154910 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6&lt;br /&gt;
#1 &amp;nbsp;0x00007ffff762d102 in qBadAlloc () at global/qglobal.cpp:1994&lt;br /&gt;
#2 &amp;nbsp;0x00007ffff7fe6e7e in DnsRequestQueuePrivate::_q_resultsReady (this=0x43af90, r=..., id=11771, code=0, ctx=...) at dnsrequestqueue.cpp:83&lt;br /&gt;
#3 &amp;nbsp;0x00007ffff7fe7629 in DnsRequestQueue::qt_static_metacall (_o=0x7fffffffded8, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0x43d130) at debug/moc_dnsrequestqueue.cpp:53&lt;br /&gt;
#4 &amp;nbsp;0x00007ffff7750446 in QObject::event (this=0x7fffffffded8, e=&amp;lt;optimized out&amp;gt;) at kernel/qobject.cpp:1195&lt;br /&gt;
#5 &amp;nbsp;0x00007ffff7736e9c in QCoreApplication::notifyInternal (this=0x7fffffffdf00, receiver=0x7fffffffded8, event=0x43d310) at kernel/qcoreapplication.cpp:876&lt;br /&gt;
...
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Для экстремалов есть такое решение: &lt;a href="http://zbigg.blogspot.com/2009/03/hijacking-throw.html"&gt;Hijacking throw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/c-cpp/qt/964-exception-source-qt/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/liMGos-KwmrIml5KkDHSc0MOshk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/liMGos-KwmrIml5KkDHSc0MOshk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/liMGos-KwmrIml5KkDHSc0MOshk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/liMGos-KwmrIml5KkDHSc0MOshk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=oMG-yPeJAo4:PmKXLEn7bn8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=oMG-yPeJAo4:PmKXLEn7bn8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=oMG-yPeJAo4:PmKXLEn7bn8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=oMG-yPeJAo4:PmKXLEn7bn8:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=oMG-yPeJAo4:PmKXLEn7bn8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/oMG-yPeJAo4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/c-cpp/qt/964-exception-source-qt/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/c-cpp/qt/964-exception-source-qt/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/c-cpp/qt/964-exception-source-qt/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Wandering Soul</name>
					</author>
		<title type="html"><![CDATA[Undefined reference на специализацию шаблона статического поля]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/Mglukf4CHRo/" />
		<id>http://blog.sjinks.pro/?p=962</id>
		<updated>2012-03-31T20:29:50Z</updated>
		<published>2012-03-31T20:24:53Z</published>
		<category scheme="http://blog.sjinks.pro" term="C/C++" /><category scheme="http://blog.sjinks.pro" term="gcc" /><category scheme="http://blog.sjinks.pro" term="ошибка" />		<summary type="html"><![CDATA[GCC временами весьма капризен Столкнулся на работе с такой проблемой при написании расширения для QtScript: код вида template&#60;typename T&#62; class EnumWrapper { /* ... */ protected: static QMap&#60;int, QString&#62; m_enum_map; static QString m_class; /* ... */ }; template&#60;&#62; QMap&#60;int, QString&#62; EnumWrapper&#60;QTextStream::RealNumberNotation&#62;::m_enum_map; template&#60;&#62; QString EnumWrapper&#60;QTextStream::RealNumberNotation&#62;::m_class(QLatin1String(&#34;QTextStream&#34;)); class QTextStream_RealNumberNotation : public EnumWrapper&#60;QTextStream::RealNumberNotation&#62; { public: QTextStream_RealNumberNotation(void) { EnumWrapper&#60;QTextStream::RealNumberNotation&#62;::m_enum_map.insert(int(QTextStream::SmartNotation), QLatin1String(&#34;SmartNotation&#34;)); [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/962-undefined-reference-to-static-field-template-initialization/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/c-cpp/962-undefined-reference-to-static-field-template-initialization/">&lt;h2&gt;&lt;em&gt;&lt;a href="http://blog.sjinks.pro/tag/gcc/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  gcc"&gt;GCC&lt;/a&gt; временами весьма капризен&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Столкнулся на работе с такой проблемой при написании расширения для QtScript: код вида&lt;span id="more-962"&gt;&lt;/span&gt;&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96240"&gt;
        &lt;div class="code cpp" id="p962code40"&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw2"&gt;typename&lt;/span&gt; T&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;class&lt;/span&gt; EnumWrapper &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span class="coMULTI"&gt;/* ... */&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw2"&gt;protected&lt;/span&gt;&lt;span class="sy4"&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; QMap&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, QString&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; m_enum_map&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; QString m_class&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="coMULTI"&gt;/* ... */&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&amp;gt;&lt;/span&gt; QMap&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, QString&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_enum_map&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&amp;gt;&lt;/span&gt; QString EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_class&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;QLatin1String&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;QTextStream&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw2"&gt;class&lt;/span&gt; QTextStream_RealNumberNotation &lt;span class="sy4"&gt;:&lt;/span&gt; &lt;span class="kw2"&gt;public&lt;/span&gt; EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt;&lt;span class="sy4"&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; QTextStream_RealNumberNotation&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_enum_map&lt;/span&gt;.&lt;span class="me1"&gt;insert&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;SmartNotation&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, QLatin1String&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;SmartNotation&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_enum_map&lt;/span&gt;.&lt;span class="me1"&gt;insert&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;FixedNotation&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, QLatin1String&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;FixedNotation&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_enum_map&lt;/span&gt;.&lt;span class="me1"&gt;insert&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ScientificNotation&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, QLatin1String&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;ScientificNotation&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="coMULTI"&gt;/* ... */&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
QTextStream_RealNumberNotation c&lt;span class="sy4"&gt;;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;делает полученную библиотеку незагружаемой.&lt;/p&gt;
&lt;p&gt;Методом проб и ошибок было установлено, что всему виной такая декларация:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96241"&gt;
        &lt;div class="code cpp" id="p962code41"&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&amp;gt;&lt;/span&gt; QMap&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, QString&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_enum_map&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Чтобы лучше понять суть проблемы, набросал небольшой test case, который не использует сторонних библиотек (мало ли, вдруг &lt;a href="http://blog.sjinks.pro/tag/qt/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Qt"&gt;Qt&lt;/a&gt; виноват):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96242"&gt;
        &lt;div class="code cpp" id="p962code42"&gt;
&lt;span class="co2"&gt;#include &amp;lt;map&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="co2"&gt;#include &amp;lt;utility&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw2"&gt;typename&lt;/span&gt; T&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;class&lt;/span&gt; Test &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt;&lt;span class="sy4"&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Test&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;void&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_map.&lt;span class="me1"&gt;insert&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;make_pair&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0, 0&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;map&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; m_map&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&amp;gt;&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;map&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; Test&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_map&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw4"&gt;int&lt;/span&gt; main&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy2"&gt;**&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Test&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; t&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;И вот оно, gcc громко ругается:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96243"&gt;
        &lt;div class="code text" id="p962code43"&gt;
$ g++ test.cpp -o test&lt;br /&gt;
/tmp/ccyD9dfl.o:test.cpp:function Test&amp;lt;char&amp;gt;::Test(): error: undefined reference to 'Test&amp;lt;char&amp;gt;::m_map'&lt;br /&gt;
collect2: ld returned 1 exit status
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Компоновщик почему-то в упор отказывается замечать декларацию&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96244"&gt;
        &lt;div class="code cpp" id="p962code44"&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&amp;gt;&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;map&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; Test&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_map&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В VC9 такое не проявляется.&lt;/p&gt;
&lt;p&gt;На решение натолкнула следующая за QMap декларация:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96245"&gt;
        &lt;div class="code cpp" id="p962code45"&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&amp;gt;&lt;/span&gt; QString EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_class&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;QLatin1String&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;QTextStream&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;На неё компоновщик не ругается. А вся разница — в явном вызове конструктора. Поэтому, если сделать как-то так:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96246"&gt;
        &lt;div class="code cpp" id="p962code46"&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&amp;gt;&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;map&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; Test&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;char&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_map&lt;/span&gt; &lt;span class="sy1"&gt;=&lt;/span&gt; std&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;map&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="co1"&gt;// Для исходного случая:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw2"&gt;template&lt;/span&gt;&lt;span class="sy1"&gt;&amp;lt;&amp;gt;&lt;/span&gt; QMap&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, QString&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt; EnumWrapper&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;QTextStream&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;RealNumberNotation&lt;/span&gt;&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sy4"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;m_enum_map&lt;/span&gt; &lt;span class="sy1"&gt;=&lt;/span&gt; QMap&lt;span class="sy1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kw4"&gt;int&lt;/span&gt;, QString&lt;span class="sy1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy4"&gt;;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;то компоновщик перестаёт ругаться.&lt;/p&gt;
&lt;p&gt;Шаблонная магия и костылестроение.&lt;/p&gt;
&lt;p&gt;Может, кому-то пригодится.&lt;/p&gt;
&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/c-cpp/962-undefined-reference-to-static-field-template-initialization/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/miHxnnPTOUnBfuMzF8OB5YjPXKQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/miHxnnPTOUnBfuMzF8OB5YjPXKQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/miHxnnPTOUnBfuMzF8OB5YjPXKQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/miHxnnPTOUnBfuMzF8OB5YjPXKQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Mglukf4CHRo:0j8F0P2r4JI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Mglukf4CHRo:0j8F0P2r4JI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Mglukf4CHRo:0j8F0P2r4JI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Mglukf4CHRo:0j8F0P2r4JI:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Mglukf4CHRo:0j8F0P2r4JI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/Mglukf4CHRo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/c-cpp/962-undefined-reference-to-static-field-template-initialization/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/c-cpp/962-undefined-reference-to-static-field-template-initialization/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/c-cpp/962-undefined-reference-to-static-field-template-initialization/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Wandering Soul</name>
					</author>
		<title type="html"><![CDATA[DropBox, Upstart и официальная Wiki]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/9shj88LWh8g/" />
		<id>http://blog.sjinks.pro/?p=961</id>
		<updated>2012-03-31T19:56:41Z</updated>
		<published>2012-03-31T19:56:41Z</published>
		<category scheme="http://blog.sjinks.pro" term="Linux" /><category scheme="http://blog.sjinks.pro" term="DropBox" /><category scheme="http://blog.sjinks.pro" term="Upstart" /><category scheme="http://blog.sjinks.pro" term="ошибка" />		<summary type="html"><![CDATA[Почему официальный рецепт не работает В официальной Wiki DropBox приведён рецепт запуска dropbox при старте системе с использованием Upstart: start on runlevel 2 start on runlevel 3 start on runlevel 4 start on runlevel 5 stop on shutdown respawn script # Without next line DB does not sync non ASCII characters (ubuntu 10.04-x86_64, db 0.7.110) [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/961-dropbox-upstart-official-wiki/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/linux/961-dropbox-upstart-official-wiki/">&lt;h2&gt;&lt;em&gt;Почему официальный рецепт не работает&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;В официальной Wiki &lt;a href="http://blog.sjinks.pro/tag/dropbox/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  DropBox"&gt;DropBox&lt;/a&gt; &lt;a href="http://dropboxwiki.com/Text_Based_Linux_Install#using_upstart"&gt;приведён&lt;/a&gt; рецепт запуска dropbox при старте системе с использованием &lt;a href="http://blog.sjinks.pro/tag/upstart/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Upstart"&gt;Upstart&lt;/a&gt;:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96151"&gt;
        &lt;div class="code text" id="p961code51"&gt;
start on runlevel 2&lt;br /&gt;
start on runlevel 3&lt;br /&gt;
start on runlevel 4&lt;br /&gt;
start on runlevel 5&lt;br /&gt;
stop on shutdown&lt;br /&gt;
respawn&lt;br /&gt;
script &lt;br /&gt;
&amp;nbsp; &amp;nbsp; # Without next line DB does not sync non ASCII characters (ubuntu 10.04-x86_64, db 0.7.110) &lt;br /&gt;
&amp;nbsp; &amp;nbsp; export LANG=en_US.UTF-8&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cd /home/dropbox&lt;br /&gt;
&amp;nbsp; &amp;nbsp; exec sudo -H -u dropbox ./.dropbox-dist/dropbox&lt;br /&gt;
end script
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Тем не менее, если использовать данный рецепт на сервере (при условии, что на сервере X-сервер не используется), то работать не будет.&lt;span id="more-961"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Причина, как обычно, в том, что разработчики имеют трудности с чтением документации на те продуты, которые они используют, а также с тестированием предлагаемых решений &lt;img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;В частности, &lt;code&gt;man 5 init&lt;/code&gt; говорит:&lt;/p&gt;
&lt;blockquote&gt;If a stanza is duplicated, the last occurence will be used.&lt;/blockquote&gt;
&lt;p&gt;Поэтому конфигурация&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96152"&gt;
        &lt;div class="code text" id="p961code52"&gt;
start on runlevel 2&lt;br /&gt;
start on runlevel 3&lt;br /&gt;
start on runlevel 4&lt;br /&gt;
start on runlevel 5
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;будет иметь тот же эффект, что и&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96153"&gt;
        &lt;div class="code text" id="p961code53"&gt;
start on runlevel 5
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Правильный вариант:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96154"&gt;
        &lt;div class="code text" id="p961code54"&gt;
start on runlevel [2345]
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/linux/961-dropbox-upstart-official-wiki/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ri_jgmLRYaFBbY5KLlOn1-Ns_9k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ri_jgmLRYaFBbY5KLlOn1-Ns_9k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ri_jgmLRYaFBbY5KLlOn1-Ns_9k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ri_jgmLRYaFBbY5KLlOn1-Ns_9k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=9shj88LWh8g:NZw2MynvhqY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=9shj88LWh8g:NZw2MynvhqY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=9shj88LWh8g:NZw2MynvhqY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=9shj88LWh8g:NZw2MynvhqY:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=9shj88LWh8g:NZw2MynvhqY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/9shj88LWh8g" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/linux/961-dropbox-upstart-official-wiki/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/linux/961-dropbox-upstart-official-wiki/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/linux/961-dropbox-upstart-official-wiki/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://blog.sjinks.pro/</uri>
					</author>
		<title type="html"><![CDATA[Исправление проблемы обхода хранителя экрана в X11]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/Rc9Qf181eZ0/" />
		<id>http://blog.sjinks.pro/?p=960</id>
		<updated>2012-01-19T12:18:51Z</updated>
		<published>2012-01-19T12:18:51Z</published>
		<category scheme="http://blog.sjinks.pro" term="Linux" /><category scheme="http://blog.sjinks.pro" term="Безопасность" /><category scheme="http://blog.sjinks.pro" term="безопасность" /><category scheme="http://blog.sjinks.pro" term="уязвимость" />		<summary type="html"><![CDATA[Программистов всё больше, а профессионалов всё меньше В X.Org Server 1.11 обнаружена уязвимость, позволяющая через манипуляции с клавиатурой обойти режим блокировки экрана и получить доступ к заблокированному рабочему окружению пользователя. Подробности либо по ссылке выше, либо на OpenNet. Исправление: в файле /usr/share/X11/xkb/compat/xfree86 закомментировать следующие строки: interpret XF86_Ungrab { action = Private(type=0x86, data=&#34;Ungrab&#34;); }; interpret XF86_ClearGrab [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/">&lt;h2&gt;&lt;em&gt;Программистов всё больше, а профессионалов всё меньше&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;В X.Org Server 1.11 &lt;a href="http://gu1.aeroxteam.fr/2012/01/19/bypass-screensaver-locker-program-xorg-111-and-up/"&gt;обнаружена уязвимость&lt;/a&gt;, позволяющая через манипуляции с клавиатурой обойти режим блокировки экрана и получить доступ к заблокированному рабочему окружению пользователя.&lt;/p&gt;
&lt;p&gt;Подробности либо по ссылке выше, либо на &lt;a href="http://www.opennet.ru/opennews/art.shtml?num=32844"&gt;OpenNet&lt;/a&gt;.&lt;span id="more-960"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Исправление: в файле &lt;code&gt;/usr/share/X11/xkb/compat/xfree86&lt;/code&gt; закомментировать следующие строки:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p96056"&gt;
        &lt;div class="code text" id="p960code56"&gt;
&amp;nbsp; &amp;nbsp; interpret XF86_Ungrab {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; action = Private(type=0x86, data=&amp;quot;Ungrab&amp;quot;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; };&lt;br /&gt;
&amp;nbsp; &amp;nbsp; interpret XF86_ClearGrab {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; action = Private(type=0x86, data=&amp;quot;ClsGrb&amp;quot;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; };
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;После чего перезапустить X Server.&lt;/p&gt;
&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mX2uhfQUg4kmTuWqyQnnEnm8v9s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mX2uhfQUg4kmTuWqyQnnEnm8v9s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mX2uhfQUg4kmTuWqyQnnEnm8v9s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mX2uhfQUg4kmTuWqyQnnEnm8v9s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Rc9Qf181eZ0:lyYMjBmkhhI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Rc9Qf181eZ0:lyYMjBmkhhI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Rc9Qf181eZ0:lyYMjBmkhhI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=Rc9Qf181eZ0:lyYMjBmkhhI:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=Rc9Qf181eZ0:lyYMjBmkhhI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/Rc9Qf181eZ0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/#comments" thr:count="9" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/feed/atom/" thr:count="9" />
		<thr:total>9</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://blog.sjinks.pro/</uri>
					</author>
		<title type="html"><![CDATA[Автоматическое добавление ссылки на источник при копировании текста с сайта]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/sjblog/~3/mas6Ms03BaM/" />
		<id>http://blog.sjinks.pro/?p=958</id>
		<updated>2012-01-14T03:42:35Z</updated>
		<published>2012-01-14T03:42:35Z</published>
		<category scheme="http://blog.sjinks.pro" term="JavaScript" /><category scheme="http://blog.sjinks.pro" term="jQuery" /><category scheme="http://blog.sjinks.pro" term="SEO" />		<summary type="html"><![CDATA[Навязчивое добавление ссылки на оригинал при копировании текста с сайта Идея: когда пользователь выделяет часть текста и копирует её в буфер обмена (например, чтобы выложить на своём сайте), автоматически добавлять к выделению ссылку на источник. Реализация: var source_link = &#039;&#60;p&#62;Подробнее: &#60;a href=&#34;&#039; + location.href + &#039;&#34;&#62;&#039; + location.href + &#039;&#60;/a&#62;&#60;/p&#62;&#039;; jQuery( function($) { if (window.getSelection) [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/">источник</a> обязательно.</p>]]></summary>
		<content type="html" xml:base="http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/">&lt;h2&gt;&lt;em&gt;Навязчивое добавление ссылки на оригинал при копировании текста с сайта&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Идея:&lt;/strong&gt; когда пользователь выделяет часть текста и копирует её в буфер обмена (например, чтобы выложить на своём сайте), автоматически добавлять к выделению ссылку на источник.&lt;span id="more-958"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Реализация:&lt;/strong&gt;&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p95858"&gt;
        &lt;div class="code javascript" id="p958code58"&gt;
&lt;span class="kw2"&gt;var&lt;/span&gt; source_link &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'&amp;lt;p&amp;gt;Подробнее: &amp;lt;a href=&amp;quot;'&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; location.&lt;span class="me1"&gt;href&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="st0"&gt;'&amp;quot;&amp;gt;'&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; location.&lt;span class="me1"&gt;href&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="st0"&gt;'&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
jQuery&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;window.&lt;span class="me1"&gt;getSelection&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; $&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'#content div.post'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;bind&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;'copy'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; selection &lt;span class="sy0"&gt;=&lt;/span&gt; window.&lt;span class="me1"&gt;getSelection&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; range &lt;span class="sy0"&gt;=&lt;/span&gt; selection.&lt;span class="me1"&gt;getRangeAt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; magic_div &lt;span class="sy0"&gt;=&lt;/span&gt; $&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'&amp;lt;div&amp;gt;'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;css&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; overflow &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;'hidden'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; width&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;'1px'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; height &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;'1px'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; position &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;'absolute'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; top&lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;'-10000px'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; left &lt;span class="sy0"&gt;:&lt;/span&gt; &lt;span class="st0"&gt;'-10000px'&lt;/span&gt; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; magic_div.&lt;span class="me1"&gt;append&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;range.&lt;span class="me1"&gt;cloneContents&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; source_link&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'body'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;append&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;magic_div&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; cloned_range &lt;span class="sy0"&gt;=&lt;/span&gt; range.&lt;span class="me1"&gt;cloneRange&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selection.&lt;span class="me1"&gt;removeAllRanges&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; new_range &lt;span class="sy0"&gt;=&lt;/span&gt; document.&lt;span class="me1"&gt;createRange&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new_range.&lt;span class="me1"&gt;selectNode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;magic_div.&lt;span class="me1"&gt;get&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selection.&lt;span class="me1"&gt;addRange&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;new_range&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; window.&lt;span class="me1"&gt;setTimeout&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;function&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selection.&lt;span class="me1"&gt;removeAllRanges&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selection.&lt;span class="me1"&gt;addRange&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;cloned_range&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; magic_div.&lt;span class="me1"&gt;remove&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; 0&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Настраиваемые параметры&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;source_link&lt;/code&gt; — текст, который будет добавляться к копируемому фрагменту. В данном примере задаётся статически, но при желании генерацию ссылки можно усложнить (например, при копировании с текста с домашней страницы можно возвращать ссылку на статью, из которой взята данная цитата). Для этого в строке &lt;code&gt;magic_div.append(range.cloneContents(), source_link);&lt;/code&gt; вместо &lt;code&gt;source_link&lt;/code&gt; нужно использовать свою функцию, возвращающую HTML для вставки в копируемый фрагмент.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;'#content div.post'&lt;/code&gt; — выражение, задающее один или более контейнер с текстом, при копировании которого нужно добавлять ссылку на оригинал. Идея в том, что добавлять ссылку на статью при копировании, скажем, части текста одного из комментариев к статье было бы нелогично. С помощью данного выражения можно задать требуемые защищаемые объекты.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Возможные улучшения:&lt;/strong&gt; проверка длины копируемого текста. Например, если пользователь копирует меньше 20 слов, не добавлять ссылку. Получить выделенный текст можно через &lt;code&gt;range.cloneContents().textContent&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;© 2012 &lt;a href="http://blog.sjinks.pro"&gt;Ars Longa, Vita Brevis&lt;/a&gt;. Все права защищены. Перепубликация материалов без разрешения автора запрещена.&lt;/p&gt;
&lt;p&gt;При использовании материалов блога наличие активной не закрытой от индексирования ссылки на &lt;a href="http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/"&gt;источник&lt;/a&gt; обязательно.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KGJDg089F7dfpB_0F-_aAZ5gQaY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KGJDg089F7dfpB_0F-_aAZ5gQaY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KGJDg089F7dfpB_0F-_aAZ5gQaY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KGJDg089F7dfpB_0F-_aAZ5gQaY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=mas6Ms03BaM:CaCA-0h2m9o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=mas6Ms03BaM:CaCA-0h2m9o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=mas6Ms03BaM:CaCA-0h2m9o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?i=mas6Ms03BaM:CaCA-0h2m9o:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/sjblog?a=mas6Ms03BaM:CaCA-0h2m9o:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/sjblog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/mas6Ms03BaM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/#comments" thr:count="25" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/feed/atom/" thr:count="25" />
		<thr:total>25</thr:total>
	<feedburner:origLink>http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/</feedburner:origLink></entry>
	</feed>

