์๋ฒ ๋๋ IPython ์ ธ์ ์ง์ญ ๋ณ์๋ฅผ ์ถ์ ํ์ง ๋ชปํ ์ ์์ต๋๋ค.
์ต์ ํ ์คํธ ์ผ์ด์ค:
class Foo(object):
""" Container-like object """
def __setattr__(self, obj, val):
self.__dict__[obj] = val
def __getattr__(self, obj, val):
return self.__dict__[obj]
f = Foo()
f.indices = set([1,2,3,4,5])
f.values = {}
for x in f.indices:
f.values[x] = x
def bar(foo):
import IPython
IPython.Shell.IPShellEmbed()()
return sum(foo.values[x] for x in foo.indices)
print bar(f)
์ค๋ฅ๋ฅผ ๋ณด๋ ค๋ฉด ๋จผ์ Python(๋๋ IPython)์์ ์ฝ๋๋ฅผ ์คํํ๊ณ ์์ฑ๋ ์
ธ์ ์ข
๋ฃํฉ๋๋ค. ์ต์ข
์ธ์ ๋ฌธ์ '15'๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํฉ๋๋ค. ์ฝ๋๋ฅผ ๋ค์ ์คํํ์ง๋ง ์ด๋ฒ์๋ ์์ฑ๋ ์
ธ์ sum(foo.values[x] for x in foo.indices)
๋ฅผ ์
๋ ฅํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
" NameError: ์ ์ญ ์ด๋ฆ 'foo'๊ฐ ์ ์๋์ง ์์์ต๋๋ค."
ํ , 'foo'๋ ์ด๋์์ ์ ์ํ์ จ๋์?
ํจ์ ํ์์ค ์ธ๋ถ์์ foo ํธ์ถ์ ์คํํ๋ฉด foo๊ฐ ์์ด์ผ ํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ๋ถ๋ช ํ ์กด์ฌํ์ง ์์ต๋๋ค).
๋์ "sum(f.values[x] for x in f.indices)"๋ฅผ ์คํํ๋ฉด ๋ค์ 15๊ฐ ๋ฉ๋๋ค...
์์ฃผ ์ ํํฉ๋๋ค. ๊ทธ๋ฌ๋ foo
_inside_ ์์ฑ๋ IPython ์
ธ์ ์ฌ์ฉ์ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค. ์์ฑ๋ IPython ์
ธ์ foo
๊ฐ ๋ก์ปฌ ๋ณ์์ธ ํจ์ ์ ์ ๋ด๋ถ์์ ์์ฑ๋ฉ๋๋ค.
#62์ ๊ฐ์ ๋ฌธ์ ์ผ๊น์?
์๋์, @takluyver : ์ด๊ฒ์ ๋ณ๋์ ๋ฌธ์ ์ด๋ฉฐ ์ค์ ๋ก ์๋ฒ ๋ฉ ์ฝ๋์ ์ค์ ๋ฒ๊ทธ์ ๋๋ค. ์ต๊ทผ์ ๋ค์์คํ์ด์ค์ ๋ํ ์์ ์ผ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ธฐ๋ฅผ ๋ฐ๋์ง๋ง ๊ทธ๋ ์ง ์์์ต๋๋ค. ์ฐธ๊ณ ๋ก ํ์ฌ ์๋ฒ ๋ฉ API๋ก ์คํํ ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class Foo(object):
""" Container-like object """
def __setattr__(self, obj, val):
self.__dict__[obj] = val
def __getattr__(self, obj, val):
return self.__dict__[obj]
f = Foo()
f.indices = set([1,2,3,4,5])
f.values = {}
for x in f.indices:
f.values[x] = x
def bar(foo):
import IPython
IPython.embed()
return sum(foo.values[x] for x in foo.indices)
print bar(f)
๊ทธ๋ฐ ๋ค์ ์์ฑ๋๊ณ ํฌํจ๋ IPython์์ ๋ค์๊ณผ ๊ฐ์ด ์คํจํฉ๋๋ค.
In [1]: sum(foo.values[x] for x in foo.indices)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/home/fperez/tmp/junk/ipython/foo.py in <module>()
----> 1 sum(foo.values[x] for x in foo.indices)
/home/fperez/tmp/junk/ipython/foo.py in <genexpr>((x,))
----> 1 sum(foo.values[x] for x in foo.indices)
NameError: global name 'foo' is not defined
ํฌํจ ํธ์ถ user_ns=locals()
๋ช
์์ ์ผ๋ก ์ ๋ฌํ๋๋ผ๋ ์๋ํ์ง ์์ง๋ง ์ด ๊ฒฝ์ฐ ์ข
๋ฃ ์ ์ถ๊ฐ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/home/fperez/usr/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2702, in atexit_operations
self.reset(new_session=False)
File "/home/fperez/usr/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 1100, in reset
self.displayhook.flush()
File "/home/fperez/usr/lib/python2.7/site-packages/IPython/core/displayhook.py", line 319, in flush
self.shell.user_ns['_oh'].clear()
KeyError: '_oh'
์ฐ๋ฆฌ ์๋ฒ ๋ฉ ๊ธฐ๊ณ์ ์ํ๊ฐ ์๋นํ ์ข์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค...
์ด๊ฒ์ ๋ ์์ ์๊ฒ ํ ๋นํ์ฌ ์ดํด๋ด ๋๋ค.
ํ๋ฅญํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋ถํํ๋ ์ด๊ฒ์ด Python ์์ฒด์ ํ๊ณ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋์ ์ผ๋ก ์ปดํ์ผ๋ ์ฝ๋๋ ํด๋ก์ ๋ฅผ ์ ์ํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด๋ ๋ณธ์ง์ ์ผ๋ก ์ฌ๊ธฐ์์ ์์ฑ๊ธฐ ํํ์์ผ๋ก ์ํํ๋ ์์ ์ ๋๋ค. ๋ค์์ ์ต์ํ์ ํ ์คํธ ์ผ์ด์ค์ ๋๋ค.
def f():
x = 1
exec "def g(): print x\ng()"
f()
๋ค์์ ์ ๊ณตํฉ๋๋ค.
Traceback (most recent call last):
File "scopetest.py", line 5, in <module>
f()
File "scopetest.py", line 3, in f
exec "def g(): print x\ng()"
File "<string>", line 2, in <module>
File "<string>", line 1, in g
NameError: global name 'x' is not defined
IPython์์ ์ฌ์ ํ ์ง์ญ ๋ณ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ฃผ์ด์ง ์์ ์์ ์ผ๋ฐ print foo
์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ฒ์๋ฅผ ๋ซ์ ์๋ ์์ต๋๋ค.
IPython์ด ์ ์ญ ๋ณ์๋ก ํฌํจ๋ ์ง์ญ ๋ฐ ์ ์ญ ๋ณ์๋ฅผ ๋ชจ๋ ๋ณผ ์ ์๋๋ก Python 3.3์ collections.ChainMap
๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์
์ ์ํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง๋ 2๋
๋์ ์ด๊ฒ์ ๋ํ ๋
ธ์ด์ฆ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์ฐ์ ์์๊ฐ ๋์ง ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก ๊ทธ์ ๋ฐ๋ผ ํ๊ทธ๋ฅผ ๋ค์ ์ง์ ํ๊ณ 1.0 ์ดํ์ ์ธ์ ๊ฐ๋ ์ด์ ๋๋ฌํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฐฌ์ฑ ํฌํ๊ฐ ํ์ฉ๋ฉ๋๊น? :+1: ? ์ด๊ฒ์ ๋์๊ฒ๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์์ฒญํ๋ ๊ฒฝ์ฐ ๋ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ์์ ์ด Python 3์์๋ง ์๋ํ๋ค๋ฉด 100% ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค.
Python 3์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ค์ ์ด์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋์ผํ ๋ฌธ์ :+1: Python 2์ 3 ๋ชจ๋์์.
Python 2์ 3 ๋ชจ๋์์ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋งค์ผ ์ ์๊ฒ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ์กฐ์ฌํ ๊ฒฐ๊ณผ ํ์คํ ๊ณ ์น ์ ์์ต๋๋ค(Python 2์ 3 ๋ชจ๋์ ๋ํ ์์ ์ฌํญ์ ์ ์ง ๊ด๋ฆฌํ๋ ๊ฒ์ ์ง์ ๋ถํ ์ ์์ง๋ง).
ChainMap ์๋ฃจ์
์ ์ ์ ํ IPython์ ํฌํจํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ eval/exec์์๋ ์ ์ญ ๋ณ์๊ฐ dict
์ฌ์ผ ํ๋ค๋ ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. class MyChainMap(ChainMap, dict): pass
์์ฑํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋ํ ํด๋ก์ ์
์ ์๋ฎฌ๋ ์ด์
ํ๊ณ ํ์ด์ฌ ์ปดํ์ผ๋ฌ๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ด๋ณด๋ด๋๋ก ๊ฐ์ ํ๋ ๋ค๋ฅธ ์ ๋ต์ ๊ธฐ๋ฐ์ผ๋ก Python 3.5+ ์์ ์ฌํญ์ ์์ฑํ์ต๋๋ค. ๊ด๋ จ ํ์ผ์ ์ฌ๊ธฐ ๋ด xdbg ๋ฐ๋ชจ์ ์ผ๋ถ์
๋๋ค. get_ipython().run_ast_nodes
๋ฅผ ๋์ฒดํ์ฌ ์๋ํฉ๋๋ค.
๋ด๊ฐ ๋งํ ์ ์๋ ํ, ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ํด๋ก์ ์ฒ๋ฆฌ์์๋ง ๋ค๋ฆ
๋๋ค. xdbg
๊ฐ ์ผ๋ถ ๋ณ์์ ๋ํด ๋ซํ ๋ฒ์์ ํฌํจ๋๋ฉด ์ฐธ์กฐ๋ฅผ ํตํด ํด๋น ๋ณ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ก์ธ์คํ๊ณ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ํ ๋ํํ ์ธํฐํ๋ฆฌํฐ์์ ํจ์๊ฐ ์์ฑ๋๋ฉด ๋๋จธ์ง ๋ก์ปฌ ๋ฒ์๊ฐ ๊ฐ๋น์ง ์์ง๋๋๋ก ํ์ฉํ๋ฉด์ ํ์ํ ๋ชจ๋ ๋ก์ปฌ ๋ณ์๋ฅผ ๋ซ์ต๋๋ค.
IPython 6.0 ์ด์ ๋ฒ์ ์ Python 3์์๋ง ์๋ํ๋ฏ๋ก @nikitakit ๋๋ ๋ค๋ฅธ ์ฌ๋์ด ํ ์คํธ ์ฌ๋ก์ ์ด์ ๋ํ ์์ ์ฌํญ์ด ํฌํจ๋ pull ์์ฒญ์ ์ด๊ณ ์ถ๋ค๋ฉด ํ์ํ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ง์ง๋ง์ผ๋ก ๋๊ธ์ ๋ฌ๊ณ 1๋ ์ด ์ง๋ฌ๊ณ ์ด ๊ธฐ๊ฐ ๋์ ๋ฌธ์ ์ ๋ํ ์ดํด๊ฐ ์ฝ๊ฐ ๋ฐ๋์์ต๋๋ค.
๋ํ์์ผ๋ก ์ง์ญ ๋ฒ์๋ฅผ ๊ฒ์ฌํ๋ ๊ฒ์ ๋์๊ฒ ์ค์ํ ๊ธฐ๋ฅ์ผ๋ก ๋จ์ ์์ง๋ง ์ค์ ๋ก ์ง์ญ ๋ณ์ ๋ฐ ์๋ฒ ๋ฉ ๊ธฐ๊ณ์ ๊ด๋ จํ์ฌ ์ฌ๋ฌ ๊ฐ์ง ์ํธ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํฌํจ๋ ์ ธ ๋ด์์ ๋ก์ปฌ ๋ณ์๋ฅผ ์์ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
>>> import IPython
>>> def test():
... x = 5
... IPython.embed()
... print('x is', x)
...
>>> test()
Python 3.5.1 |Continuum Analytics, Inc.| (default, Dec 7 2015, 11:24:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: x
Out[1]: 5
In [2]: x = 6
In [3]:
Do you really want to exit ([y]/n)? y
x is 5
ChainMap
๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ด ์ํฉ์์ ๋์์ด ๋์ง ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์ง๋ฌธ์ ์๋ฒ ๋๋ ์ ๋ด๋ถ์ ์ ์๋ ํด๋ก์ ๊ฐ ์ ์ญ ๋ฒ์๋ก ์ ์ถ๋ ๋ ์ด๋ป๊ฒ ๋๋์ง์
๋๋ค. ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ๋ ์๋ฒ ๋๋ IPython ์
ธ์์ IPython.get_my_x = lambda: x
ํ์ ๋ฐ๋ผ ๋ฌด์ธ๊ฐ๋ฅผ ์
๋ ฅํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ChainMap
๊ธฐ๋ฐ ์๋ฃจ์
์ ์ด ์ํฉ์์ ์๋ก ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ x
์ ๋ ๊ฐ์ ๋์ ๋ณต์ฌ๋ณธ์ ์ ์ฌ์ ์ผ๋ก ๋์
ํ๋ ๋์ NameError
๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค(ํ๋๋ ChainMap
, ๋ค๋ฅธ ํ๋๋ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๊ฐ ์ฌ์ฉํ๋ ์ง์ญ ๋ณ์/ํด๋ก์ ์
).
์ํฉ์ ๋ณต์ก์ฑ์ ๊ฐ์ํ ๋ ๋๋ ๋ฌธ์ ์ ๋ํ ๋ณด๋ค ํฌ๊ด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋
ธ๋ ฅ์ ์ง์คํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก IPython๊ณผ ํตํฉ๋๋ ๋๋ฒ๊ฑฐ์ธ xdbg ์ ๊ฐ๋ฐ๋ก %break
). ์ค๋จ์ ์ด embed
ํจ์๋ฅผ ์ ์๋ฆฌ์์ ํธ์ถํ๋ ๋์ ์ธ๋ถ์์ ์ค์ ๋๋ค๋ ์ฌ์ค๋ก ์ธํด ๋ก์ปฌ ๋ณ์๋ก ์ด๋ฌํ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ตฌํ์ด ๊ฐ๋ฅํ์ต๋๋ค.
์ ๋ ํ์ฌ ์ฝ์ด IPython์ ๋ํ ์ข์ ํ๊ฒ ๋ฒ๊ทธ ์์ ์ ํ ์์ฒญ(pull-request)ํ ๊ณํ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ก์ปฌ ์ฝ๋ ๊ฒ์ฌ๋ฅผ ์ํด ๋๋ฒ๊ฑฐ์์ ์๊ฐ์ ๋ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด IPython ์ฌ์ฉ์์ ๊ฐ๋ฐ์๊ฐ ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์๊ณ ์ถ์ต๋๋ค. IPython(์ง๊ธ์ Jupyter๋ ํฌํจ)์ Python์์ ๋ํํ ์ฝ๋ฉ์ ์ํํ๋ ๊ธฐ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์ณค์ง๋ง ํด๋์ค/ํจ์/๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ฌด๊ฑฐ์ด ์บก์ํ์ ์ํธ ์์ฉํ๋ ๋ฐฉ์์์ ์ฌ์ ํ ๊ฐ์ ํด์ผ ํ ์ฌํญ์ด ๋ง์ด ์์ต๋๋ค.
์ด ๋ฒ๊ทธ๋ก ์ธํด ์ฌ๋ฌ ๋ฒ ํ์์ ์ ์์ต๋๋ค. ์
[mcgibbon<strong i="6">@xps13</strong>:~]$ cat test.py
x = 1
def func():
x = 2
import IPython
IPython.embed()
if __name__ == "__main__":
func()
[mcgibbon<strong i="9">@xps13</strong>:~]$ python test.py
Python 3.7.6 (default, Dec 18 2019, 19:23:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.12.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: [x for _ in range(2)]
Out[1]: [1, 1] # lol whoops. looked up in wrong scope.
๋ฌด์์ ํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ํฉ์ฐฝ๋จ์ ์ ๋ชฉ์๋ฆฌ๋ฅผ ๋ํ๋ ๊ฒ๋ฟ์ ๋๋ค.
https://bugs.python.org/issue13557 ๊ณผ ๋ช ์์ ์ผ๋ก locals() ๋ฐ globals()๋ฅผ exec์ ์ ๋ฌํ๋ฉด @takluyver ์ ๋ฒ๊ทธ ์ฌํ์ด ์์ ๋๋ค๋ ์ฌ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ ํ ์ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ๋ก์ปฌ ๋ฐ ๊ธ๋ก๋ฒ ๋ค์์คํ์ด์ค๋ฅผ ์ ๋ฌํ์ฌ IPython.
x = 1
def func():
x = 2
exec("def g():\n print(x)\ng()") # prints 1 :(
exec("def g():\n print(x)\ng()", locals(), globals()) # prints 2 yay!
if __name__ == "__main__":
func()
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ์กฐ์ฌํ ๊ฒฐ๊ณผ ํ์คํ ๊ณ ์น ์ ์์ต๋๋ค(Python 2์ 3 ๋ชจ๋์ ๋ํ ์์ ์ฌํญ์ ์ ์ง ๊ด๋ฆฌํ๋ ๊ฒ์ ์ง์ ๋ถํ ์ ์์ง๋ง).
ChainMap ์๋ฃจ์ ์ ์ ์ ํ IPython์ ํฌํจํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ eval/exec์์๋ ์ ์ญ ๋ณ์๊ฐ
dict
์ฌ์ผ ํ๋ค๋ ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.class MyChainMap(ChainMap, dict): pass
์์ฑํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.๋ํ ํด๋ก์ ์ ์ ์๋ฎฌ๋ ์ด์ ํ๊ณ ํ์ด์ฌ ์ปดํ์ผ๋ฌ๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ด๋ณด๋ด๋๋ก ๊ฐ์ ํ๋ ๋ค๋ฅธ ์ ๋ต์ ๊ธฐ๋ฐ์ผ๋ก Python 3.5+ ์์ ์ฌํญ์ ์์ฑํ์ต๋๋ค. ๊ด๋ จ ํ์ผ์ ์ฌ๊ธฐ ๋ด xdbg ๋ฐ๋ชจ์ ์ผ๋ถ์ ๋๋ค.
get_ipython().run_ast_nodes
๋ฅผ ๋์ฒดํ์ฌ ์๋ํฉ๋๋ค.๋ด๊ฐ ๋งํ ์ ์๋ ํ, ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ํด๋ก์ ์ฒ๋ฆฌ์์๋ง ๋ค๋ฆ ๋๋ค.
xdbg
๊ฐ ์ผ๋ถ ๋ณ์์ ๋ํด ๋ซํ ๋ฒ์์ ํฌํจ๋๋ฉด ์ฐธ์กฐ๋ฅผ ํตํด ํด๋น ๋ณ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ก์ธ์คํ๊ณ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ํ ๋ํํ ์ธํฐํ๋ฆฌํฐ์์ ํจ์๊ฐ ์์ฑ๋๋ฉด ๋๋จธ์ง ๋ก์ปฌ ๋ฒ์๊ฐ ๊ฐ๋น์ง ์์ง๋๋๋ก ํ์ฉํ๋ฉด์ ํ์ํ ๋ชจ๋ ๋ก์ปฌ ๋ณ์๋ฅผ ๋ซ์ต๋๋ค.