systemtap :

各种资源的使用限制由所生成的C代码中的宏来设置。这些值可在编译时由-D选项来重写。下面描述了部分挑选出来的宏:

MAXNESTING 递归函数的最大调用层数,默认值是10。

MAXSTRINGLEN 字符串的最大长度,默认值是128。

MAXTRYLOCK 在声称可以出现死锁和跳出探测点前,等待全局变量锁的最大迭代次数,默认值是1000。

MAXACTION 单个探测点内可以执行语句数的最大值,默认值是1000。

MAXMAPENTRIES 数组在声明时没有显示指定大小时,数组的最大行数(译者注:即组数的最大下标个数),默认值为2048。

MAXERRORS  在触发退出前,可以容忍软件错误个数的最大值,默认值是0。

MAXSKIPPED 在触发退出前,可忽略的重入探测点的最大值,默认值是100。

MINSTACKSPACE 运行探测处理函数所需要的内核栈的最小字节数。此数值应比探测处理函数所需内核栈的大小加上安全边界大小足够大。默认值是1024。

Stap或statrun如果在探测点已经运行之后出现问题,可以安全杀死(kill)用户空间进程,并且可以使用rmmod命令删除内核探测模块。任何未处理的跟踪消息将丢失。
变量的引用有两种风格:
$varname // 引用变量varname
$var->field // 引用结构的成员变量
$var[N] // 引用数组的元素
&$var // 变量的地址 @var("varname") // 引用变量varname
@var("var@src/file.c") // 引用src/file.c在被编译时的全局变量varname
@var("varname@file.c")->field // 引用结构的成员变量
@var("var@file.c")[N] // 引用数组的元素
&@var("var@file.c") // 变量的地址 $var$ // provide a string that includes the values of basic type values
$var$$ // provide a string that includes all values of nested data types $$vars // 一个包含所有函数参数、局部变量的字符串
$$locals // 一个包含所有局部变量的字符串
$$params // 一个包含所有函数参数的字符串
[root@localhost bin]# stap -L 'process("/usr/local/mysql56/bin/mysqld").function("MDL_context::acquire_lock")'    

 process("/usr/local/mysql56/bin/mysqld").function("MDL_context::acquire_lock@/usr/src/mysql-5.6.28/sql/mdl.cc:2184") $this:class MDL_context* const $mdl_request:class MDL_request* $lock_wait_timeout:ulong $lock:struct MDL_lock* $ticket:struct MDL_ticket* $abs_timeout:struct timespec $wait_status:enum enum_wait_status $__PRETTY_FUNCTION__:char[] const

基于源代码函数:

[root@localhost bin]# stap -v -g -d /usr/local/mysql56/bin/mysqld --ldd  -e 'probe process("/usr/local/mysql56/bin/mysqld").function("MDL_context::acquire_lock") { printf("got it\n");print_ubacktrace();mdelay(10000) }'|c++filt

打印函数参数变量

会话1:

mysql> insert into uu select ;

会话2:

[root@localhost bin]# stap -v -g -D MAXSTRINGLEN= -d /usr/local/mysql56/bin/mysqld --ldd  -e 'probe process("/usr/local/mysql56/bin/mysqld").function("MDL_context::acquire_lock") { printf("%s\n %s\n",probefunc(),$$parms$$);mdelay(1000) }'|c++filt
MDL_context::acquire_lock(MDL_request*, unsigned long)
this={.m_wait={.m_LOCK_wait_status={.m_mutex={.global={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .mutex={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .file="/usr/src/mysql-5.6.28/sql/mdl.cc", .line=, .count=, .thread=}, .m_psi=0x0}, .m_COND_wait_status={.m_cond={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x0, .__nwaiters=, ...}, ...}, ...}, ...}, ...} mdl_request={.type=, .duration=, .next_in_list=0xff2c7a, .prev_in_list=0x1e13380, .ticket=0x0,
.key={.m_length=, .m_db_name_length=, .m_ptr=""
} } lock_wait_timeout=31536000 MDL_context::acquire_lock(MDL_request*, unsigned long)
this={.m_wait={.m_LOCK_wait_status={.m_mutex={.global={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .mutex={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .file="/usr/src/mysql-5.6.28/sql/mdl.cc", .line=, .count=, .thread=}, .m_psi=0x0}, .m_COND_wait_status={.m_cond={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x0, .__nwaiters=, ...}, ...}, ...}, ...}, ...} mdl_request={.type=, .duration=, .next_in_list=0x0, .prev_in_list=0x0, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr="test"}} lock_wait_timeout=31536000 MDL_context::acquire_lock(MDL_request*, unsigned long)
this={.m_wait={.m_LOCK_wait_status={.m_mutex={.global={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .mutex={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .file="/usr/src/mysql-5.6.28/sql/mdl.cc", .line=, .count=, .thread=}, .m_psi=0x0}, .m_COND_wait_status={.m_cond={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x0, .__nwaiters=, ...}, ...}, ...}, ...}, ...} mdl_request={.type=, .duration=, .next_in_list=0x1000000ab7cbe, .prev_in_list=0xf2f3bb, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr=""}} lock_wait_timeout=

打印局部变量:

会话1:

mysql> insert into uu select ;

会话2:

[root@localhost bin]# stap -v -g -D MAXSTRINGLEN= -d /usr/local/mysql56/bin/mysqld --ldd  -e 'probe process("/usr/local/mysql56/bin/mysqld").function("MDL_context::acquire_lock") { printf("%s\n %s\n",probefunc(),$$locals$$);mdelay(1000) }'|c++filt
MDL_context::acquire_lock(MDL_request*, unsigned long)
lock={.key={.m_length=, .m_db_name_length=, .m_ptr=""}, .m_rwlock={.m_prlock={.lock={.__data={.__lock=-, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x76b4ad, .__next=0xf27abd}}, .__size="", .__align=}, .no_active_readers={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x100000000e3ed37, .__nwaiters=, .__broadcast_seq=}, .__size="7+", .__align=}, .active_readers=, .writers_waiting_readers=, .active_writer='\001', .writer_thread=}, .m_psi=0x1e13380}, .m_granted={.m_list={.m_first=0x25b3cd0, .m_last=0x0}, .m_bitmap=}, .m_waiting={.m_list={.m_first=0x14f600e3ed37, ...}, ...}, ...} ticket={.next_in_context=0x22e1ec0, .prev_in_context=0x1e13380, .next_in_lock=0xab7bcf, .prev_in_lock=0xff01ac, .m_type=, .m_duration=, .m_ctx=0x2b37140bfab0, .m_lock=0xab7cbe} abs_timeout={.tv_sec=, .tv_nsec=} wait_status= __PRETTY_FUNCTION__="bool MDL_context::acquire_lock(MDL_request*, ulong)" MDL_context::acquire_lock(MDL_request*, unsigned long)
lock=ERROR ticket={.next_in_context=0x8b48e87d894820ec, .prev_in_context=0xc08548009ff3c305, .next_in_lock=0x8948e8458b480b75, .prev_in_lock=0xfdcee8009ff3b305, .m_type=, .m_duration=, .m_ctx=0x558b480b7400f87d, .m_lock=0x28948e8458b48f8} abs_timeout={.tv_sec=, .tv_nsec=} wait_status= __PRETTY_FUNCTION__="bool MDL_context::acquire_lock(MDL_request*, ulong)" MDL_context::acquire_lock(MDL_request*, unsigned long)
lock={.key={.m_length=, .m_db_name_length=, .m_ptr=""}, .m_rwlock={.m_prlock={.lock={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0xc1, .__next=0x100000}}, .__size="", .__align=}, .no_active_readers={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x22d77c0, .__nwaiters=, .__broadcast_seq=}, .__size="", .__align=}, .active_readers=, .writers_waiting_readers=, .active_writer='\000', .writer_thread=}, .m_psi=0x0}, .m_granted={.m_list={.m_first=0x0, .m_last=0x384}, .m_bitmap=}, .m_waiting={.m_list={.m_first=0x1058783, ...}, ...}, ...} ticket={.next_in_context=0x10000022e1ec0, .prev_in_context=0x2b37140bfbb0, .next_in_lock=0xe3ed37, .prev_in_lock=0x22e1fe0, .m_type=, .m_duration=, .m_ctx=0x100000000000001, .m_lock=0x22e1fe0} abs_timeout={.tv_sec=, .tv_nsec=} wait_status= __PRETTY_FUNCTION__="bool MDL_context::acquire_lock(MDL_request*, ulong)"

打印局部变量+函数参数变量

MDL_context::acquire_lock(MDL_request*, unsigned long)
this={.m_wait={.m_LOCK_wait_status={.m_mutex={.global={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .mutex={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .file="/usr/src/mysql-5.6.28/sql/mdl.cc", .line=, .count=, .thread=}, .m_psi=0x0}, .m_COND_wait_status={.m_cond={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x0, .__nwaiters=, ...}, ...}, ...}, ...}, ...} mdl_request={.type=, .duration=, .next_in_list=0xff2c7a, .prev_in_list=0x1e13380, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr=""}} lock_wait_timeout= lock={.key={.m_length=, .m_db_name_length=, .m_ptr=""}, .m_rwlock={.m_prlock={.lock={.__data={.__lock=-, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x76b4ad, .__next=0xf27abd}}, .__size="", .__align=}, .no_active_readers={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x100000000e3ed37, .__nwaiters=, .__broadcast_seq=}, .__size="7+", .__align=}, .active_readers=, .writers_waiting_readers=, .active_writer='\001', .writer_thread=}, .m_psi=0x1e13380}, .m_granted={.m_list={.m_first=0x25b3cd0, .m_last=0x0}, .m_bitmap=}, .m_waiting={.m_list={.m_first=0x14f600e3ed37, ...}, ...}, ...} ticket={.next_in_context=0x22e1ec0, .prev_in_context=0x1e13380, .next_in_lock=0xab7bcf, .prev_in_lock=0xff01ac, .m_type=, .m_duration=, .m_ctx=0x2b37140bfab0, .m_lock=0xab7cbe} abs_timeout={.tv_sec=, .tv_nsec=} wait_status= __PRETTY_FUNCTION__="bool MDL_context::acquire_lock(MDL_request*, ulong)" MDL_context::acquire_lock(MDL_request*, unsigned long)
this={.m_wait={.m_LOCK_wait_status={.m_mutex={.global={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .mutex={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .file="/usr/src/mysql-5.6.28/sql/mdl.cc", .line=, .count=, .thread=}, .m_psi=0x0}, .m_COND_wait_status={.m_cond={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x0, .__nwaiters=, ...}, ...}, ...}, ...}, ...} mdl_request={.type=, .duration=, .next_in_list=0x0, .prev_in_list=0x0, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr="test"}} lock_wait_timeout= lock=ERROR ticket={.next_in_context=0x8b48e87d894820ec, .prev_in_context=0xc08548009ff3c305, .next_in_lock=0x8948e8458b480b75, .prev_in_lock=0xfdcee8009ff3b305, .m_type=, .m_duration=, .m_ctx=0x558b480b7400f87d, .m_lock=0x28948e8458b48f8} abs_timeout={.tv_sec=, .tv_nsec=} wait_status= __PRETTY_FUNCTION__="bool MDL_context::acquire_lock(MDL_request*, ulong)"

MDL_context::acquire_lock(MDL_request*, unsigned long)
this={.m_wait={.m_LOCK_wait_status={.m_mutex={.global={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .mutex={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0x0, .__next=0x0}}, .__size="", .__align=}, .file="/usr/src/mysql-5.6.28/sql/mdl.cc", .line=, .count=, .thread=}, .m_psi=0x0}, .m_COND_wait_status={.m_cond={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x0, .__nwaiters=, ...}, ...}, ...}, ...}, ...} mdl_request={.type=, .duration=, .next_in_list=0x1000000ab7cbe, .prev_in_list=0xf2f3bb, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr=""}} lock_wait_timeout= lock={.key={.m_length=, .m_db_name_length=, .m_ptr=""}, .m_rwlock={.m_prlock={.lock={.__data={.__lock=, .__count=, .__owner=, .__nusers=, .__kind=, .__spins=, .__list={.__prev=0xc1, .__next=0x100000}}, .__size="", .__align=}, .no_active_readers={.__data={.__lock=, .__futex=, .__total_seq=, .__wakeup_seq=, .__woken_seq=, .__mutex=0x22d77c0, .__nwaiters=, .__broadcast_seq=}, .__size="", .__align=}, .active_readers=, .writers_waiting_readers=, .active_writer='\000', .writer_thread=}, .m_psi=0x0}, .m_granted={.m_list={.m_first=0x0, .m_last=0x384}, .m_bitmap=}, .m_waiting={.m_list={.m_first=0x1058783, ...}, ...}, ...} ticket={.next_in_context=0x10000022e1ec0, .prev_in_context=0x2b37140bfbb0, .next_in_lock=0xe3ed37, .prev_in_lock=0x22e1fe0, .m_type=, .m_duration=, .m_ctx=0x100000000000001, .m_lock=0x22e1fe0} abs_timeout={.tv_sec=, .tv_nsec=} wait_status= __PRETTY_FUNCTION__="bool MDL_context::acquire_lock(MDL_request*, ulong)"

打印其中的某个变量值的内部某个成员

会话1:

mysql> insert into uu select 1;

会话2:

[root@localhost bin]# stap -v -g -D MAXSTRINGLEN= -d /usr/local/mysql56/bin/mysqld --ldd  -e 'probe process("/usr/local/mysql56/bin/mysqld").function("MDL_context::acquire_lock") { printf("%s\n %d\n",probefunc(),$mdl_request->type);mdelay(1000) }'|c++filt
MDL_context::acquire_lock(MDL_request*, unsigned long)

MDL_context::acquire_lock(MDL_request*, unsigned long)

MDL_context::acquire_lock(MDL_request*, unsigned long)
 

打印其中的某个变量值的全部成员:

会话1:

mysql> insert into uu select ;

会话2:

[root@localhost bin]# stap -v -g -D MAXSTRINGLEN= -d /usr/local/mysql56/bin/mysqld --ldd  -e 'probe process("/usr/local/mysql56/bin/mysqld").function("MDL_context::acquire_lock") { printf("%s\n %s\n",probefunc(),$mdl_request$$);mdelay(1000) }'|c++filt
MDL_context::acquire_lock(MDL_request*, unsigned long)
{.type=, .duration=, .next_in_list=0xff2c7a, .prev_in_list=0x1e13380, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr=""}}
MDL_context::acquire_lock(MDL_request*, unsigned long)
{.type=, .duration=, .next_in_list=0x0, .prev_in_list=0x0, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr="test"}}
MDL_context::acquire_lock(MDL_request*, unsigned long)
{.type=, .duration=, .next_in_list=0x1000000ab7cbe, .prev_in_list=0xf2f3bb, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr=""}}
^CPass : run completed in 10usr/80sys/23132real ms.
[root@localhost bin]# stap -v -g -D MAXSTRINGLEN= -d /usr/local/mysql56/bin/mysqld --ldd  -e 'probe process("/usr/local/mysql56/bin/mysqld").function("MDL_request::MDL_request") { printf("%s\n %s\n",probefunc(),$$parms$$);mdelay(10000) }'|c++filt

MDL_request::MDL_request()
this={.type=, .duration=, .next_in_list=0x0, .prev_in_list=0x14edc50, .ticket=0x25a7f70, .key={.m_length=, .m_db_name_length=, .m_ptr=""}}
MDL_request::MDL_request()
this={.type=, .duration=, .next_in_list=0x0, .prev_in_list=0x0, .ticket=0x0, .key={.m_length=, .m_db_name_length=, .m_ptr=""}}
MDL_request::MDL_request()
this=ERROR
MDL_request::MDL_request()
this={.type=, .duration=, .next_in_list=0x8b48e87d894820ec, .prev_in_list=0xc08548009ff3c305, .ticket=0x8948e8458b480b75, .key={.m_length=, .m_db_name_length=, .m_ptr=""}}
MDL_request::MDL_request()
this={.type=, .duration=, .next_in_list=0xeeb551, .prev_in_list=0xee97d0, .ticket=0x2b37140bfd40, .key={.m_length=, .m_db_name_length=, .m_ptr=""}}
MDL_request::MDL_request()
this={.type=, .duration=, .next_in_list=0x8b48e87d894820ec, .prev_in_list=0xc08548009ff3c305, .ticket=0x8948e8458b480b75, .key={.m_length=, .m_db_name_length=, .m_ptr=""}}

mdl 锁 SYSTEMTAP跟踪的更多相关文章

  1. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  2. mysql 原理 ~ DDL之mdl锁

    一 简介: MDL锁 二 具体 1 MDL锁   1 增删查改 申请MDL读锁   2 ddl语句       1. 拿MDL写锁      2. 降级成MDL读锁      3. 真正做DDL    ...

  3. 用systemtap跟踪打印动态链接库的所有c++函数调用过程

    http://gmd20.blog.163.com/blog/static/168439232015475525227/             用systemtap跟踪打印动态链接库的所有c++函数 ...

  4. 有了MDL锁视图,业务死锁从此一目了然

    摘要:MDL锁视图让一线运维人员清晰地查看数据库各session持有和等待的元数据锁信息,从而找出数据库MDL锁等待的根因,准确地进行下一步决策. 当多用户共同存取数据时,数据库中就会产生多个事务同时 ...

  5. MDL锁

    mdl锁的主要作用是用来维护表元数据的一致性.在表上有活动事务的时候,不可以对表元数据进行修改操作. 如果没有MDL锁的保护,那么session2可以直接执行,并导致session1出错. MDL锁是 ...

  6. sync fsync fdatasync ---systemtap跟踪

    aa.stp: probe kernel .function ( "sys_sync" ) { printf ( "probfunc:%s fun:%s\n", ...

  7. systemtap跟踪C

    1.[root@localhost ~]# rpm -qi  glibcName        : glibc                        Relocations: (not rel ...

  8. 深入理解MYSQL的MDL元数据锁

    1 前言 2 MDL锁与实现 3 MDL锁的性能与并发改进 4 MDL锁的诊断 前言 好久没更新,主要是因为Inside君最近沉迷于一部动画片——<新葫芦娃兄弟>.终于抽得闲,完成了本篇关 ...

  9. 深入理解MDL元数据锁

    前言:  当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processli ...

随机推荐

  1. [Apple开发者帐户帮助]一、开始(3)账户信息

    您帐户中显示的部分取决于您是否拥有免费帐户或是否已注册付费程序(Apple Developer Program或Apple Developer Enterprise Program).此外,您可以在这 ...

  2. c#,Java aes加密

    1.c#版本 /// <summary> /// Aes加密解密.c#版 /// </summary> public class BjfxEncryptHelper { /// ...

  3. for 循环的中的i

    for循环中的i,如果倒过来判断从某数一直到0,一定不能用unsigned int类型的i,因为unsigned int不可能小于0,当i=0后,i--将达到最大的unsigned int,依旧> ...

  4. HDU 4474 Yet Another Multiple Problem BFS

    题意:求m的倍数中不包含一些数码的最小倍数数码是多少.比如15 ,不包含0  1 3,答案是45. BFS过程:用b[]记录可用的数码.设一棵树,树根为-1.树根的孩子是所有可用的数码,孩子的孩子也是 ...

  5. MySQL学习笔记之内连接

    不多说,直接上干货!  MySQL的内连接 #内连接,两个表按照条件匹配 select class1.stuid,class1.stuname,class1.sex,course from class ...

  6. 域名转让(bcd.cn,tjcpda.com,jscpda.com,fjcpda.com)

    因本人工作有所调整,现对所拥有的域名全部转让,有需要者请与我联系,谢谢. bcd.cn tjcpda.com jscpda.com fjcpda.com 联系方式: QQ:1181608198 Ema ...

  7. Django学习案例一(blog):三. 模型生成数据

    1. 什么是模型models Django中以创建类的形式来创建数据表. 在编写代码的过程中,所有对数据库的操作,都是对类和类的对象进行操作. ORM对象关系映射(Object relation ma ...

  8. oracle-3种工具使用

    1:原命令行,dos 2:sqlplus,图形界面 3:isqlplus,网页版的.(假如自己机器无法安装oracle,可通过别人ip地址去使用oracle,http://ip:5560/isqlpl ...

  9. 【sqli-labs】 less19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)

    这个和less18一样,都是基于header的注入 这次的字段是referer Referer: ' AND UpdateXml(1,concat(0x7e,database(),0x7e),1),1 ...

  10. 【sqli-labs】 less11 POST - Error Based - Single quotes- String (基于错误的POST单引号字符型注入)

    查看源码,用户名和密码通过post提交 加单引号提交 出现报错,推测对应的SQL语句 , 直接使用or构造永真登录 成功,注意此处登录的用户为表中的第一个用户 需要改变用户可以通过改变筛选条件实现 作 ...